perm filename VDPSER.XGP[SS,SYS] blob sn#474585 filedate 1979-09-05 generic text, type T, neo UTF8
/FONT#0=FIX20.FNT[XGP,SYS]
/BMAR=1
/TMAR=128
/RMAR=1699
/LMAR=128
/PMAR=2065
/XLINE=3
SAIL  ME        14:47:01 Wednesday, September 5, 1979   FQ+6D.17H.26M.27S.
VDPSER.NEW[S,SYS] Created 13:49 Wednesday, September 5, 1979   FQ+6D.16H.28M.26S.


VVV         VVV      DDDDDDDDD            PPPPPPPPPPPP            SSSSSSSSS         EEEEEEEEEEEEEEE      RRRRRRRRRRRR   
VVV         VVV      DDDDDDDDD            PPPPPPPPPPPP            SSSSSSSSS         EEEEEEEEEEEEEEE      RRRRRRRRRRRR   
VVV         VVV      DDDDDDDDD            PPPPPPPPPPPP            SSSSSSSSS         EEEEEEEEEEEEEEE      RRRRRRRRRRRR   
VVV         VVV      DDD      DDD         PPP         PPP      SSS         SSS      EEE                  RRR         RRR
VVV         VVV      DDD      DDD         PPP         PPP      SSS         SSS      EEE                  RRR         RRR
VVV         VVV      DDD      DDD         PPP         PPP      SSS         SSS      EEE                  RRR         RRR
VVV         VVV      DDD         DDD      PPP         PPP      SSS                  EEE                  RRR         RRR
VVV         VVV      DDD         DDD      PPP         PPP      SSS                  EEE                  RRR         RRR
VVV         VVV      DDD         DDD      PPP         PPP      SSS                  EEE                  RRR         RRR
VVV         VVV      DDD         DDD      PPPPPPPPPPPP            SSSSSSSSS         EEEEEEEEEEEE         RRRRRRRRRRRR   
VVV         VVV      DDD         DDD      PPPPPPPPPPPP            SSSSSSSSS         EEEEEEEEEEEE         RRRRRRRRRRRR   
VVV         VVV      DDD         DDD      PPPPPPPPPPPP            SSSSSSSSS         EEEEEEEEEEEE         RRRRRRRRRRRR   
VVV         VVV      DDD         DDD      PPP                              SSS      EEE                  RRR   RRR      
VVV         VVV      DDD         DDD      PPP                              SSS      EEE                  RRR   RRR      
VVV         VVV      DDD         DDD      PPP                              SSS      EEE                  RRR   RRR      
   VVV   VVV         DDD      DDD         PPP                  SSS         SSS      EEE                  RRR      RRR   
   VVV   VVV         DDD      DDD         PPP                  SSS         SSS      EEE                  RRR      RRR   
   VVV   VVV         DDD      DDD         PPP                  SSS         SSS      EEE                  RRR      RRR   
      VVV            DDDDDDDDD            PPP                     SSSSSSSSS         EEEEEEEEEEEEEEE      RRR         RRR
      VVV            DDDDDDDDD            PPP                     SSSSSSSSS         EEEEEEEEEEEEEEE      RRR         RRR
      VVV            DDDDDDDDD            PPP                     SSSSSSSSS         EEEEEEEEEEEEEEE      RRR         RRR



SAIL  ME        14:47:01 Wednesday, September 5, 1979   FQ+6D.17H.26M.27S.
VDPSER.NEW[S,SYS] Created 13:49 Wednesday, September 5, 1979   FQ+6D.16H.28M.26S.


NNN         NNN      EEEEEEEEEEEEEEE      WWW         WWW
NNN         NNN      EEEEEEEEEEEEEEE      WWW         WWW
NNN         NNN      EEEEEEEEEEEEEEE      WWW         WWW
NNNNNN      NNN      EEE                  WWW         WWW
NNNNNN      NNN      EEE                  WWW         WWW
NNNNNN      NNN      EEE                  WWW         WWW
NNN   NNN   NNN      EEE                  WWW         WWW
NNN   NNN   NNN      EEE                  WWW         WWW
NNN   NNN   NNN      EEE                  WWW         WWW
NNN      NNNNNN      EEEEEEEEEEEE         WWW   WWW   WWW
NNN      NNNNNN      EEEEEEEEEEEE         WWW   WWW   WWW
NNN      NNNNNN      EEEEEEEEEEEE         WWW   WWW   WWW
NNN         NNN      EEE                  WWW   WWW   WWW
NNN         NNN      EEE                  WWW   WWW   WWW
NNN         NNN      EEE                  WWW   WWW   WWW
NNN         NNN      EEE                  WWWWWW   WWWWWW
NNN         NNN      EEE                  WWWWWW   WWWWWW
NNN         NNN      EEE                  WWWWWW   WWWWWW
NNN         NNN      EEEEEEEEEEEEEEE      WWW         WWW
NNN         NNN      EEEEEEEEEEEEEEE      WWW         WWW
NNN         NNN      EEEEEEEEEEEEEEE      WWW         WWW


Switch Settings: L[FAIL] % C -J 5000S 3V 81V 120W X ↑ 
Fonts: F[FIX20.FNT[XGP,SYS],,] 
LREC File:  SAIL:VDPNEW.LRC[SS,SYS]

                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 1␈↓'α
  001           COMMENT ⊗   VALID 00018 PAGES
  002           C REC  PAGE   DESCRIPTION
  003           C00001 00001
  004           C00005 00002	RECDM RECDM0 RECDM8 RECDM5 RECDM3 RECDM9 RECDM4 RECDM6 RECDM2 RECDM7
  005           C00011 00003	RECNED RECNER RECNNE RECNSP RECQNC RECQSP RECQVC RECNNQ RECNEC RECNE2 RECNEQ RECNEA RECN
                EZ RECNEN RECNEE RECNES NECLR NEFLSH NEHOLD NEHOL1 NEUNH NEC600 RECNEM RECNM1 RECNM2 RECNM3 MACMAX CHRMA
                C CHRMA1 CHRMA2 CHRMA3 CHRMA6 CHRMA7 CHRMA0 CHRMA4 CHRMA5 CHRMA8 CHRMA9 GETMAC GETMA1 DMMODE DMMODN DMMO
                D0 DMMOD1 DMQESC DMQES2 NOEDFL NEHTFL NEALLQ NEQMOD NEMMOD NECMOD NENUMB NEQUOT NEMETA NECTRL NETBPT NEB
                BPT NESBPT NEMBPT NECNUM NECQUO NECDSP NECCNV NECSUP NECVEC VECTNM NECHAR NECVBP CHRMAC GETMAC
  006           C00038 00004	TBSSET RAPPED NOINTR DMBPND LEWAIT DMSTAY DMXCAL DMQUOT TRUNCA NOEEOL NOEEOB BETWEE USER
                GO CHASTE PROTLE DMATXY DMXLE QUO177 DMUXFR BLNKON PROTON IDON DMUMSK CTRLCH DMTAPE
  007           C00045 00005	DMTABL dispatch table for quoted DM control characters
  008           C00052 00006	PADID DM128 NO177 NOBOLD NODICU NBTSEQ DM2500 HP2648 TELERAY
  009           C00066 00007	DMXMT DMXMG2 DMXMGO DMXMT0 DMXMTP DMXDEQ DMXMT1 DMXMT9 DMXMT2 DMXM8L DMXM8C DMXM8U DMNOX
                Y DMXMT8 NODPYH NODPYH
  010           C00075 00008	XYGET XYGET2 XYCHK DMSETQ
  011           C00077 00009	DMXMTL DMXMUS DMXMTO DMXMTM DMLEM5 DMXMT6 DMXMT3 DMXMT5 DMTAB3 DMNOOP DMNOO2 DMXM5A DMXM
                5B DMXM5X DMCR2 DMLF4 DMXM5D SKIPCR RANGE0 RANGE
  012           C00086 00010	IGNOR0 IGNOR3 IGNOR2 IGNFF DMMAST DMERAS DMHOME DMBACK DMFOR2 DMFORW DM175 DM177B
  013           C00092 00011	DMXMT7 DM177 DMXM4A DMXMT4 DMCALC DMBELL DMCHPD DM30PD DM30PA DM30PB DM25PA DM25PB DMCAL
                X DMPADM
  014           C00099 00012	DMBETW DMBET2 DMTAB DMSPA9 DMSPA8 DMTABC
  015           C00102 00013	DMSPAC DMSPA4 DMSPA2 DMSPA3
  016           C00104 00014	DMLEMV DMLEM2 DMLEM3 DMLEM4
  017           C00106 00015	DMLEFX
  018           C00110 00016	DMLEDE DMPROT DMBLNK DMCANC DMID DMUP DMFOR3 DMEEOL DMLED1 DMLED2
  019           C00114 00017	DMCR3 DMLF2 DMLF3 DMCR4 DMCR DMLF DMLF1
  020           C00116 00018	DMCURS DMCUR2 DMXR2 DMOUT2 DMXL1 DMXR1 DMCUR4 DMYU2 DMYD1 DMYU1 DMCUR5 DPCBEG DM25CU HP2
                6CU DPCEND TELECU DMCUR3 DMOUT1 DMPREP DMPRE1 DMPR1A DMPRE2 DMPR2A DMPRE3 DMPRE4 DMPRE6 DMPR6A DMPRE7 DM
                PRE8
  021           C00128 ENDMK
  022           C⊗;
                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 2␈↓'α
  001           ;RECDM RECDM0 RECDM8 RECDM5 RECDM3 RECDM9 RECDM4 RECDM6 RECDM2 RECDM7
  002           
  003           ;PREPROCESSING ROUTINE FOR DMs TO MAKE THEIR INPUT CHARS LOOK LIKE DD/III CHARS
  004           ;Direct return taken if char is just "ESC" or "ADD META" (no more handling).
  005           ;Skip return taken if not DM or preprocessing not needed (eg, PTWR1W or image mode).
  006           ;  Note that if we came from RECINT, then the 10400 bits cannot be on!
  007           ;Double skips on DM after doing the preprocessing (now char looks like on DD/III).
  008           RECDM:	MOVE TAC,LINTAB(LINE)
  009           	TRNN CHR,10400		;Char in DD/III form (esc or meta char)?
  010           	TLNN TAC,DMLIN		;No, is this a Datamedia display?
  011           	JRST CPOPJ1		;Not DM or doesn't need preprocessing
  012           IFN FTNOED,<
  013           	SKIPLE MACROC		;Are we expanding a character macro?
  014           	JRST CPOPJ1		;Yes, no preprocessing needed.
  015           >;IFN FTNOED
  016           	SKIPN DDB,TTYTAB(LINE)	;Skip preprocessing if image mode
  017  002 024  	JRST RECDM0		;No DDB, can't be image mode
  018           	MOVE IOS,DEVIOS(DDB)	;Check for image mode
  019           	TRNE IOS,10
  020           	TRNE IOS,6		;Image mode 10 or 11?
  021  002 024  	JRST RECDM0		;No, do preprocessing
  022           	JRST CPOPJ1		;Yes, don't do DM preprocessing
  023           
  024           RECDM0:
  025           IFN FTNOED,<
  026           	SKIPE AC1,LETAB(LINE)	;Get DPY header
  027           	SKIPL AC2,NOEDIT(AC1)	;Skip if no-edit-key DM
  028           	JRST .+2		;No.
  029  003 005  	JRST RECNED		;Yes.
  030           >;IFN FTNOED
  031           	SETZB AC1,AC2		;Used by DMESC and below
  032           	JUMPE CHR,DMESC		;NULL is the DM display ESCAPE char
  033           	CAIN CHR,200
  034           	JRST DMMETA		;EDIT-NULL is the "add META" character
  035           	AOS (P)			;Take double skip return now
  036           	LDB UCHN,[POINT 1,CHR,28] ;Get EDIT bit
  037           	ANDI CHR,177		;Flush EDIT bit and any other garbage
  038           	CAIGE CHR,40		;Special char?
  039  005 024  	MOVE AC1,DMTABL(CHR)	;Yes, get DM bits for this char
  040           	TRNN TAC,REGESC!SPCESC	;Is char being quoted or getting META added?
  041  002 052  	JRST RECDM5		;No
  042           	TRNN TAC,REGESC
  043  002 048  	JRST RECDM8		;Add META
  044  005 012  	TLNE AC1,INQUOT		;Can we quote this char?
  045           	DPB AC2,[ESCFLD+LINE,,LINTAB] ;Yes, clear quote (ESC) flag
  046  002 085  	JRST RECDM2		;No, must be ESC char
  047           
  048           RECDM8:	IORI UCHN,2		;Give him META
  049           	DPB AC2,[ESCFLD+LINE,,LINTAB] ;Clear "add META" flag
  050  005 012  	TLNE AC1,INQUOT		;Does META quote this char?
  051  002 085  	JRST RECDM2		;Yes
  052           RECDM5:	TLNE TAC,PTYLIN		;If this is a non-ARPA PTY, then no
  053           	TLNE TAC,IMPBIT		; ASCII to Stanford conversion needed
  054  002 057  	JRST RECDM3		;Not PTY or is ARPA PTY, do conversion
  055  005 012  	TLNN AC1,INQUOT		;Non-arpa PTY needs special action only
  056  002 085  	JRST RECDM2		; on quotable chars (CLEAR, HOLD, CALL)
  057           RECDM3:	CAIN CHR,176
  058           	JRST [	MOVEI CHR,32
  059  002 085  		JRST RECDM2]	;176→32 (tilde)
  060           	CAIN CHR,175
  061  002 085  	AOJA CHR,RECDM2		;175→176 (right brace)
  062  005 013  	TLNN AC1,DMCONV		;Need to convert this character?
  063  002 085  	JRST RECDM2		;No
  064           	LDB CHR,[POINT 9,AC1,17] ;Get new character
  065           	TRNE CHR,600
  066  002 086  	JRST RECDM7		;Already has bits--preserve 'em (CALL)
  067  002 085  	JUMPN CHR,RECDM2	;Now put in CONTROL bit, if typed
  068  005 024  	CAME AC1,DMTABL+HOLDER	;Is this the hold/unhold character
  069  002 082  	JRST RECDM6		;No, must be clear character
  070  002 078  	JUMPN UCHN,RECDM4	;EDIT-HOLD is currently a no-op (reserved)
  071           	MOVEI CHR,10044		;CONTROL-CLEAR for assumed unhold
  072           	SKIPE AC1,LETAB(LINE)
  073           	SKIPL DPHOLD(AC1)	;Are we holding?
  074           RECDM9:	MOVEI CHR,10041		;No, use CONTROL-BREAK for hold
  075           	MOVEI UCHN,1
  076  002 086  	JRST RECDM7
  077           
  078           RECDM4:	SOS (P)			;Undo the AOS we already did
  079           	POPJ P,			;So direct return for no-op char
  080           
                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 2.1␈↓'α
  081           ;Here with CLEAR.  If it was EDIT-CLEAR, it becomes META-CLEAR to flush DM queues.
  082           RECDM6:	JUMPE UCHN,.+2
  083           	MOVEI UCHN,2		;EDIT-CLEAR becomes META-CLEAR
  084           	SKIPA CHR,[10044]	;Clear--leave EDIT bit as is
  085           RECDM2:	DPB UCHN,[POINT 2,CHR,28] ;Put control bits into character
  086           RECDM7:	LDB DSER,[POINT 7,CHR,35]
  087           	CAIL DSER,"A"
  088           	CAILE DSER,"Z"
  089           	JRST CPOPJ1
  090           	TRO DSER,40		;Make lower case
  091           	JRST CPOPJ1
                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 3␈↓'α
  001           ;RECNED RECNER RECNNE RECNSP RECQNC RECQSP RECQVC RECNNQ RECNEC RECNE2 RECNEQ RECNEA RECNEZ RECNEN RECNE
                ;E RECNES NECLR NEFLSH NEHOLD NEHOL1 NEUNH NEC600 RECNEM RECNM1 RECNM2 RECNM3 MACMAX CHRMAC CHRMA1 CHRMA
                ;2 CHRMA3 CHRMA6 CHRMA7 CHRMA0 CHRMA4 CHRMA5 CHRMA8 CHRMA9 GETMAC GETMA1 DMMODE DMMODN DMMOD0 DMMOD1 DMQ
                ;ESC DMQES2 NOEDFL NEHTFL NEALLQ NEQMOD NEMMOD NECMOD NENUMB NEQUOT NEMETA NECTRL NETBPT NEBBPT NESBPT N
                ;EMBPT NECNUM NECQUO NECDSP NECCNV NECSUP NECVEC VECTNM NECHAR NECVBP CHRMAC GETMAC
  002           
  003           IFN FTNOED,<
  004           ;Get here with DPY HDR pointer in AC1, NOEDIT word in AC2
  005           RECNED:	ANDI CHR,177		;No EDIT key, so flush parity bit.
  006           	MOVEI AC3,0		;For clearing out bits later.
  007  003 407  	MOVE UCHN,NECHAR(CHR)	;Get dispatch word for this char.
  008  003 362  	TLNE AC2,NEQUOT		;Are we supposed to quote next char?
  009  003 065  	JRST RECNEQ		;Yes.
  010  003 361  	TLNE AC2,NENUMB		;Are we in a numeric arg?
  011  003 081  	JRST RECNEN		;Yes.
  012  003 357  RECNER:	TLNN AC2,NEQMOD		;Are we in a quoting mode?
  013  003 047  	JRST RECNNQ		;No.
  014           	CAIGE CHR,40		;Yes, is this character special?
  015  003 022  	JRST RECNSP		;Secial char is complicated.
  016           	TRNE TAC,REGESC		;Is ESC pending?
  017           	TDZA AC2,AC2		;Yes, no bucky bits
  018  003 369  RECNNE:	LDB AC2,NEMBPT		;No, get bucky mode
  019  003 367  	DPB AC2,NEBBPT		;Set to quote this char according to mode
  020  003 065  	JRST RECNEQ		;Now just like once-only quoting.
  021           
  022  003 356  RECNSP:	TLNE AC2,NEALLQ		;ALL-QUOTE mode?
  023  003 389  	TLZ UCHN,NECSUP		;Yes, no super characters.
  024  003 389  	TLNE UCHN,NECSUP	;Quote mode and some kind of special char.
  025  003 035  	JRST RECQSP		;Super char (CALL, HOLD, but not ESC)
  026  003 391  	TLNE UCHN,NECVEC
  027  003 041  	JRST RECQVC		;Vectorable char, might be ESC
  028           RECQNC:	TRZN TAC,REGESC		;Normal special (lined) character.  ESC on?
  029  003 018  	JRST RECNNE		;No, just like normal char in quote mode.
  030           	MOVEI AC2,REGESC	;Yes, turn off ESC flag for TTYSER
  031           	TRNN TAC,SPCESC		; unless we are controlifying end of ESC [ cmd.
  032           	ANDCAM AC2,LINTAB(LINE)
  033  003 047  	JRST RECNNQ		;Treat as if not quoting mode.
  034           
  035           RECQSP:	TRNN TAC,REGESC		;Super char, ESC bit has opposite sense
  036  003 052  	JRST RECNEC		;Just CALL does a CALL.
  037           	MOVEI AC2,REGESC	;Turn off ESC flag for TTYSER
  038           	ANDCAM AC2,LINTAB(LINE)
  039  003 018  	JRST RECNNE		;ESC CALL (etc) does buckied beta (etc)
  040           
  041  003 459  RECQVC:	LDB AC2,NECVBP		;Vectorable char, get its vector index.
  042           	ADDI AC2,(AC1)		;Index into dpy hdr
  043           	SKIPL NEVECT-1(AC2)	;Is this an ESCAPE code?
  044  003 028  	JRST RECQNC		;No, just like any other control code
  045           	JRST DMESC		;Yes, it means ESCAPE by golly.
  046           
  047  003 459  RECNNQ:	LDB AC2,NECVBP		;Get variable-char dispatch
  048  003 052  	JUMPE AC2,RECNEC	;Zero means constant char.
  049           	ADDI AC2,(AC1)		;Make pointer into dpy hdr.
  050           	SKIPE AC2,NEVECT-1(AC2)	;Skip unless this tty has a macro for this char.
  051  003 115  	JRST RECNEM		;Process the macro.
  052  003 378  RECNEC:	TLNE UCHN,NECQUO	;Is this a quoting character?
  053  003 089  	JRST RECNES		;Yes, set bucky bits.
  054  003 380  	TLNE UCHN,NECDSP	;Is this a special dispatch char?
  055           	JRST (UCHN)		;Yes, do whatever's right.
  056           	TLNE TAC,PTYLIN		;If this is a non-ARPA PTY, then no
  057           	TLNE TAC,IMPBIT		; ASCII to Stanford conversion needed
  058           	JRST .+2		;Not PTY or is ARPA PTY, do conversion
  059  003 382  	TLNN UCHN,NECCNV	;Local PTY, skip if table does ASCII/SAIL.
  060           	MOVEI CHR,(UCHN)	;Otherwise it's a nine-bit SAIL character.
  061           	LDB UCHN,[POINT 2,CHR,28]
  062           RECNE2:	AOS (P)			;This is a real character.
  063  002 085  	JRST RECDM2		;Set up ACs for TTYSER and leave.
  064           
  065  003 078  RECNEQ:	JUMPE CHR,RECNEZ	;Can't quote null.
  066           	TLNE TAC,PTYLIN		;If this is a non-ARPA PTY, then no
  067           	TLNE TAC,IMPBIT		; ASCII to Stanford conversion needed
  068           	JRST .+2		;Not PTY or is ARPA PTY, do conversion
  069  003 074  	JRST RECNEA		;No conversion for local PTY.
  070           	CAIN CHR,32		;↑Z has αTAB in its table entry
  071  003 074  	AOJA CHR,RECNEA		; but means not-equal when quoted
  072  003 382  	TLNE UCHN,NECCNV	;Does this char require ASCII/SAIL conversion?
  073           	MOVEI CHR,(UCHN)	;Yes, get the converted version.
  074  003 367  RECNEA:	LDB UCHN,NEBBPT		;Get saved bucky bits.
  075  003 368  	DPB AC3,NESBPT		;Clear out state flags.
  076  003 062  	JRST RECNE2
                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 3.1␈↓'α
  077           
  078  003 368  RECNEZ:	DPB AC3,NESBPT		;Trying to quote null, just flush quote mode
  079           	POPJ P,			; and flush this character.
  080           
  081  003 376  RECNEN:	TLNN UCHN,NECNUM	;Is this char a digit or sign?
  082  003 086  	JRST RECNEE		;No, end of numeric arg
  083           	MOVEI UCHN,1		;Yes, controlify it
  084  003 062  	JRST RECNE2
  085           
  086  003 368  RECNEE:	DPB AC3,NESBPT		;End of number.  Clear out state flags.
  087  003 012  	JRST RECNER		;This is a regular char.
  088           
  089  003 368  RECNES:	DPB UCHN,NESBPT		;Quoting char, save state flags.
  090           	POPJ P,			;No further processing of this char.
  091           
  092           NECLR:	TDZA UCHN,UCHN		;Simulate CLEAR
  093           NEFLSH:	MOVEI UCHN,1		;Simulate EDIT-CLEAR
  094           	AOS (P)
  095  002 082  	JRST RECDM6		;Join edit-key code
  096           
  097           NEHOLD:	MOVEI AC2,REGESC	;Hold.  Get rid of ESC bit for uplevel.
  098           	ANDCAM AC2,LINTAB(LINE)
  099           	TRZE TAC,REGESC		;Is it ESC HOLD?
  100  003 106  	JRST NEUNH		;Yes, unhold.
  101           	MOVE AC2,NOEDIT(AC1)	;No.  Get back flag word.
  102  003 354  	TLNN AC2,NEHTFL		;TTY HTOGGLE set?
  103  003 105  	JRST NEHOL1		;No.  Hold.
  104           	SKIPL DPHOLD(AC1)	;Are we holding?
  105           NEHOL1:	SKIPA CHR,[10041]	;No, use CONTROL-BREAK for hold
  106           NEUNH:	MOVEI CHR,10044		;CONTROL-CLEAR for unhold
  107           	MOVEI UCHN,1
  108           	AOS (P)
  109  002 086  	JRST RECDM7
  110           
  111           NEC600:	SETZB UCHN,DSER		;CALL: no bucky bits
  112           	MOVEI CHR,600		;    (as opposed to 3)
  113           	JRST CPOPJ2		; despite 600 bits on in CHR.
  114           
  115           RECNEM:	JUMPL AC2,DMESC		;If it's an ESCAPE macro, just do ESCAPE
  116           	TLNN AC2,-1		;Make sure there is a nonzero length
  117           	POPJ P,			;Else it's a null macro (can't happen)
  118           	HLRZM AC2,MACROC	;Save character count
  119           	HRLI AC2,441400		;Make 12.-bit BPT to character string
  120           	MOVEM AC2,MACROP	;Save in core.
  121           RECNM1:	ILDB CHR,MACROP		;Macro loop.  Get a char
  122           	TRZE CHR,2000
  123  003 138  	JRST RECNM3		;Special quoting character
  124           	TRZE CHR,4000
  125           	TRO CHR,10000		;Not enough room in byte to store this right.
  126           	LDB UCHN,[POINT 2,CHR,28]
  127           	TRNE CHR,10000		;If some flavor of escape char,
  128           	TRZ CHR,600		; bucky bits should be only in UCHN, not in CHR.
  129           	PUSH P,AC1		;Save our dpy hdr pointer
  130           	PUSH P,LINE		;Save our line number
  131           	PUSHJ P,RECINC		;Deal with it.
  132           	POP P,LINE
  133           	POP P,AC1
  134           RECNM2:	SOSLE MACROC		;Count down
  135  003 121  	JRST RECNM1
  136           	POPJ P,			;Done with macro
  137           
  138  003 362  RECNM3:	TRO CHR,NEQUOT		;Special quoting code:
  139  003 368  	DPB CHR,NESBPT		;Save state
  140  003 134  	JRST RECNM2
  141           
  142           ;; UUO to set up a macro definition for a character.
  143           ;; call:
  144           ;;	MOVEI AC,ADDR
  145           ;;	CHRMAC AC,
  146           ;;	 <error return -- code in AC>
  147           ;;	<success return>
  148           ;;
  149           ;;ADDR:	CHAR,,LENGTH
  150           ;;	BYTE (12)XX,XX,XX
  151           ;;	ETC
  152           ;;
  153           ;; CHAR is the character which is to be redefined.  It must be a 7-bit
  154           ;; character, and must be one of the redefinable ones.
  155           ;; LENGTH is the number of 12.-bit bytes in the macro definition.
  156           ;; If LENGTH is zero then any previous macro will be flushed and
                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 3.2␈↓'α
  157           ;; the character will have its default meaning.
  158           ;; The bytes are standard 9-bit SAIL characters, with the following
  159           ;; special codes allowed:
  160           ;;	0600	CALL
  161           ;;	2000	quote following char (↑Q)
  162           ;;	2001	quote with CONTROL (↑P)
  163           ;;	2002	quote with META (↑V)
  164           ;;	2003	quote with CONTROL-META (↑W)
  165           ;;	4041	BREAK
  166           ;;	4042	ESCAPE
  167           ;;	4044	CLEAR
  168           ;;	4241	HOLD
  169           ;;	4244	UNHOLD
  170           ;;	4444	FLUSH DM QUEUES
  171           ;; If the UUO takes the direct return, the AC will contain one of these codes:
  172           ;;	0  UUO not defined (FTNOED off) or system error
  173           ;;	1  Job's TTY not a NOEDIT display
  174           ;;	2  CHAR not a redefinable character
  175           ;;	3  Trying to redefine the only ESCAPE character
  176           ;;	4  LENGTH is greater than maximum allowed
  177           ;;	5  Some byte isn't an allowable SAIL character
  178           
  179           MACMAX←←20	;Pretty small because we stay in CH5 during the execution.
  180           
  181           ↑CHRMAC:PUSHJ P,TTYFNU		;Set up LINE etc.
  182           	MOVEI TAC,1		;Error code for not a NOEDIT dpy
  183           	JUMPE LINE,STOTAC	;Detached job
  184           	SKIPE AC2,LETAB(LINE)
  185           	SKIPL NOEDIT(AC2)
  186           	JRST STOTAC		;Not a NOEDIT dpy
  187           	XCTR XR,[MOVE DSER,(UUO)];Get user's AC
  188           	XCTR XR,[MOVE DDB,(DSER)];Get first word of arg block
  189           	HLRZ CHR,DDB		;Get char s/he wants to modify
  190           	MOVEI TAC,2		;Error code for char not vectorable
  191           	CAILE CHR,177
  192           	JRST STOTAC		;Char out of range
  193  003 459  	LDB CHR,NECVBP		;Get vector index
  194           	SOJL CHR,STOTAC		;Not vectorable
  195           	JUMPN CHR,.+2		;Skip unless NUL
  196           	HRLI CHR,400000		;Flag NUL in case restoring default ESC
  197           	ADDI CHR,NEVECT(AC2)	;Point to vector word
  198           	SKIPL AC1,(CHR)		;Is this char an ESCAPE char?
  199  003 208  	JRST CHRMA2		;No, OK to modify.
  200  003 405  	HRLI AC2,-VECTNM	;Yes, make sure there is another ESCAPE too.
  201           CHRMA1:	CAIE CHR,NEVECT(AC2)	;Is this the word we're changing?
  202           	SKIPL NEVECT(AC2)	;No, is it an ESCAPE?
  203  003 201  	AOBJN AC2,CHRMA1	;Our word, or not ESCAPE
  204  003 208  	JUMPL AC2,CHRMA2	;There is another ESCAPE, so this is OK.
  205           	MOVEI TAC,3		;Error code for eliminating last ESCAPE
  206           	JRST STOTAC
  207           
  208           CHRMA2:	MOVEI TAC,(DDB)		;Length of macro string
  209  003 179  	CAILE TAC,MACMAX	;Must be within maximum length
  210  003 258  	JRST CHRMA8		;Nope.
  211  003 261  	JUMPE TAC,CHRMA9	;User is undefining a macro.
  212           	MOVEI AC2,1(DSER)	;Set up BPT to user string
  213           	HRLI AC2,441400		;12.-bit bytes
  214           CHRMA3:	XCTR XLB,[ILDB TAC1,AC2];Get a user byte
  215           	CAIL TAC1,2000
  216           	CAILE TAC1,2003
  217  003 240  	JRST CHRMA0		;Not a special quoting code
  218  003 214  CHRMA6:	SOJG TAC,CHRMA3		;Check next char
  219           	HRRZ AC1,(CHR)		;OK.  Get previous macro block if any.
  220           	JUMPE AC1,.+2		;No previous macro
  221           	PUSHJ P,FSGIVE		;Flush it.
  222           	MOVEI TAC,2(DDB)	;OK, get length
  223           	IDIVI TAC,3		; in words
  224           	MOVEI AC3,(TAC)		;Must be here for FSGET
  225           	PUSHJ P,FSGET		;Get some FS
  226           	 JRST RTZERO		;Can't happen at UUO level
  227           	MOVEI TAC1,(AC1)	;Here is the returned block
  228           	HRLI TAC1,1(DSER)	;TAC1 is the BLT AC
  229           	ADDI TAC,-1(AC1)	;TAC has the last word to BLT into
  230           	XCTR XBLTR,[BLT TAC1,(TAC)]
  231           	HRLI AC1,(DDB)		;Get char length in LH of pointer
  232           	MOVEI TAC,(DDB)		;Length
  233  003 237  	SOJN TAC,CHRMA7		;Jump if not of length 1
  234           	XCTR XLB,[LDB TAC,[POINT 12,1(DSER),11]] ;Get first (only) char
  235           	CAIN TAC,4042		;Is it ESCAPE?
  236           	TLO AC1,400000		;Yes, flag it.
                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 3.3␈↓'α
  237           CHRMA7:	MOVEM AC1,(CHR)		;Establish the macro.
  238           	JRST CPOPJ1		;Success.
  239           
  240           CHRMA0:	TRNE TAC1,3000
  241  003 250  	JRST CHRMA4		;These bits are undefined
  242           	TRNN TAC1,4000
  243  003 253  	JRST CHRMA5		;Not an escape char
  244           	ANDI TAC1,177		;Escape char, only a few are allowed
  245           	CAIE TAC1,41		;BREAK
  246           	CAIN TAC1,42		;ESCAPE
  247  003 218  	JRST CHRMA6		;ok
  248           	CAIN TAC1,44		;CLEAR
  249  003 218  	JRST CHRMA6
  250           CHRMA4:	MOVEI TAC,5		;Error code for bad char
  251           	JRST STOTAC
  252           
  253           CHRMA5:	TRNN TAC1,177		;Is this a null?
  254           	CAIN TAC1,600		;Yes, must be a CALL
  255  003 218  	JRST CHRMA6		;ok
  256  003 250  	JRST CHRMA4		;not ok
  257           
  258           CHRMA8:	MOVEI TAC,4		;Error code for bad length
  259           	JRST STOTAC
  260           
  261           CHRMA9:	HLLZM CHR,(CHR)		;Flush old macro, maybe restoring NUL as ESC
  262           	JRST CPOPJ1
  263           
  264           ;; UUO to read a character macro.
  265           ;;
  266           ;;call:	MOVEI AC,ADDR
  267           ;;	GETMAC AC,
  268           ;;	 <error return -- not a NOEDIT DM>
  269           ;;	<success return -- ADDR is set up as CHRMAC arg block>
  270           ;;
  271           ;;ADDR:	CHR,,0
  272           ;;	BLOCK 6
  273           
  274           ↑GETMAC:PUSHJ P,TTYFNU		;Set up LINE etc.
  275           	JUMPE LINE,CPOPJ	;Detached job
  276           	SKIPE AC2,LETAB(LINE)
  277           	SKIPL NOEDIT(AC2)
  278           	POPJ P,			;Not a NOEDIT dpy
  279           	AOS (P)			;Take success return
  280           	XCTR XR,[MOVE DSER,(UUO)];Get user's AC
  281           	XCTR XR,[HLRZ CHR,(DSER)];Get user's char
  282  003 459  	LDB AC1,NECVBP		;Get its vector word
  283  003 287  	JUMPE AC1,GETMA1	;Not vectorable
  284           	ADDI AC2,-1(AC1)	;Find vector word
  285           	MOVE AC1,NEVECT(AC2)
  286           	TLZ AC1,400000		;Flush escape flag
  287           GETMA1:	XCTR XW,[HLRM AC1,(DSER)];Tell user the length
  288           	JUMPE AC1,CPOPJ		;Done if no macro
  289           	HLRZ TAC,AC1		;Length in TAC
  290           	ADDI TAC,2		;Make it words
  291           	IDIVI TAC,3
  292           	HRLZI AC2,(AC1)		;BLT org is FS block
  293           	HRRI AC2,1(DSER)	;BLT dest is user block
  294           	ADDI TAC,(DSER)		;BLT end is start plus length
  295           	XCTR XBLTW,[BLT AC2,(TAC)]
  296           	POPJ P,
  297           
  298           ;; Here from DOESC for ESC/BRK n '
  299           
  300           DMMODE:	HLL LINE,LINTAB(LINE)	;Get good bits
  301           	TLNE LINE,DMLIN		;Must be a DM
  302           	SKIPN AC2,LETAB(LINE)	; with a dpy hdr (drd)
  303           	POPJ P,
  304           	SKIPE GOTARG
  305  003 311  	JRST DMMODN		;Jump for BRK '
  306           	CAILE AC1,3		;Arg must be 3 or less
  307           	CAIN AC1,ESCNUL		; or none at all
  308  003 322  	JRST DMMOD0
  309           	JRST DMBONG		;Beep bad argument
  310           
  311           DMMODN:	CAMN AC1,[-ESCNUL]
  312  003 322  	JRST DMMOD0		;Plain BRK ' is EDIT mode
  313           	MOVMS AC1		;Else it's ALL-QUOTE mode
  314           	MOVE AC3,NOEDIT(AC2)
  315  003 356  	TLNE AC3,NEALLQ		;If already in an ALL-QUOTE mode,
  316           	CAILE AC1,3		; OK to switch to another with easy arg
                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 3.4␈↓'α
  317           	SUBI AC1,=100		;Arg must be 100 to 103 (hard to type)
  318           	JUMPL AC1,DMBONG	;Too small.
  319           	CAILE AC1,3
  320           	JRST DMBONG		;Too big.
  321           	IORI AC1,10		;Add ALL-QUOTE bit and fall through
  322           DMMOD0:	PUSH P,AC1
  323           	PUSH P,AC2
  324  003 327  	PUSH P,[DMMOD1]		;Set up call to TTY NOEDIT code
  325           	HLLM AC1,(P)		;BREAK ' clears NOEDIT
  326           	JRST NOEDCM		;POPJs back
  327           DMMOD1:	 JFCL			;skip return possible
  328           	POP P,AC1		;Get back dpy hdr in AC1
  329           	POP P,AC2		;Get back arg in AC2
  330           	JUMPL AC2,CPOPJ		;Done if entering EDIT mode
  331           	CAIN AC2,ESCNUL		;Skip if entering quote mode
  332           	TDZA TAC,TAC		;Normal noedit mode
  333           	MOVEI TAC,4(AC2)	;TAC has quote-mode bit plus buckies
  334  003 369  	DPB TAC,NEMBPT		;Set quoting mode in NOEDIT word
  335           	POPJ P,
  336           
  337           ;; Here from DOESC1 for ESC " command, sets both REGESC and ↑Q flags
  338           
  339           DMQESC:	SKIPE AC1,LETAB(LINE)	;Must be a dpy
  340           	SKIPL NOEDIT(AC1)	; in NOEDIT mode
  341  003 346  	JRST DMQES2		;Ignore cmd
  342  003 362  	MOVEI TAC,NEQUOT
  343  003 368  	DPB TAC,NESBPT		;Set ↑Q quote without bucky for next char
  344           	POPJ P,			;Turn ESC flag (back) on
  345           
  346           DMQES2:	HRROI AC3,1⊗PUNITS-1	;BH 3/13/75 BUG FIX FOR PTYUUO TO MAPPED TTY
  347           	ANDM AC3,LINTAB(LINE)	;CLEAR THE ESCAPE BITS AND ARG
  348           	POPJ P,
  349           
  350           ;Format of NOEDIT entry in DPYHDR
  351           
  352           ;LH flag bits
  353           NOEDFL←←400000			;On if TTY NOEDIT.  Must be sign bit.
  354           NEHTFL←←200000			;On if TTY HTOGGL.
  355           ;The next four bits must be together.
  356           NEALLQ←←200			;On if ALL-QUOTE mode.
  357           NEQMOD←←100			;On if any quoting mode in effect
  358           NEMMOD←←40			;Meta quoting mode
  359           NECMOD←←20			;Control quoting mode
  360           ;The next four bits must be together.
  361           NENUMB←←10			;On if ↑N numeric arg mode.
  362           NEQUOT←←4			;On if next char should be quoted.
  363           NEMETA←←2			;Meta bit for next (quoted) char
  364           NECTRL←←1			;Control bit for next (quoted) char
  365           
  366           NETBPT:	POINT 1,NOEDIT(AC1),1	;BPT to HTOGGL bit
  367           NEBBPT:	POINT 2,NOEDIT(AC1),17	;BPT to bucky bits only
  368           NESBPT:	POINT 4,NOEDIT(AC1),17	;BPT to quoting state flags
  369           NEMBPT:	POINT 4,NOEDIT(AC1),13	;BPT to noedit quoting mode
  370           
  371           
  372           ;NECHAR conversion table for no-edit-key display input.
  373           ;128. words, one per 7-bit typable character.
  374           ;LH is flag bits, RH is a dispatch of some sort depending on the bits.
  375           
  376           NECNUM←←400000			;Char is a digit or sign (for ↑N)
  377           				;  RH is the char itself
  378           NECQUO←←200000			;Char is a quoter for following char
  379           				;  RH is the state bits for NESBPT deposit
  380           NECDSP←←100000			;Char requires special processing
  381           				;  RH is the routine to JRST to
  382           NECCNV←←40000			;Char requires ASCII-to-SAIL conversion
  383           				;  RH is the converted char
  384           
  385           ;If none of the above flags are set, RH is a (9-bit) char which
  386           ;is used in place of the input (7-bit) char.  The new char will
  387           ;be the same as the old except for the below-40 control codes.
  388           
  389           NECSUP←←20000			;Char is "super" in quote mode (CALL, HOLD)
  390           
  391           NECVEC←←77			;If this LH field is nonzero, the char
  392           				;is "variable" and the field is an index
  393           				;into an index of macro definitions
  394           				;for user-definable multi-char sequences.
  395           ;If the number of characters with NECVEC set changes, the length of the
  396           ;NEVECT block in DPYHDR (in CACDAT) must be chaged too.
                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 3.5␈↓'α
  397           ;
  398           ;The macro definitions are in a block starting at NEVECT in the dpy hdr.
  399           ;Each entry is zero if there is no macro defined, or <length>,,<addr>
  400           ;where addr is the address of a free storage block containing 12.-bit
  401           ;bytes, and <length> is the number of such bytes.  Notwithstanding the
  402           ;preceding sentence, the sign bit of the vector word is on iff the
  403           ;macro char is an ESCAPE char.  (This can be either by macro or by default.)
  404           
  405           VECTNM←←13			;NUMBER OF VECTOR WORDS (FOR TTYSUB)
  406           
  407  003 380  NECHAR:	NECDSP!1,,DMESC		;000 ↑@ ESCAPE
  408           	214			;001 ↑A αFF
  409           	200+"B"			;002 ↑B αB
  410  003 111  	NECSUP!NECDSP,,NEC600	;003 ↑C CALL
  411           	200+"D"			;004 ↑D αD
  412           	200+"I"			;005 ↑E αI
  413           	240			;006 ↑F αSP
  414  003 097  	NECSUP!NECDSP,,NEHOLD	;007 ↑G HOLD
  415           	2,,377			;010 ↑H αBS
  416           	3,,11			;011 ↑I TAB
  417           	4,,12			;012 ↑J LF
  418           	5,,13			;013 ↑K VT
  419           	6,,14			;014 ↑L FF
  420           	15			;015 ↑M CR
  421  003 361  	NECQUO,,NENUMB		;016 ↑N Numeric arg
  422           	215			;017 ↑O αCR
  423  003 364  	NECQUO,,NEQUOT!NECTRL	;020 ↑P Quote with α
  424  003 362  	NECQUO,,NEQUOT		;021 ↑Q Quote without bucky
  425           	200+"R"			;022 ↑R αR
  426           	200+"S"			;023 ↑S αS
  427           	200+"T"			;024 ↑T αT
  428  003 092  	NECDSP,,NECLR		;025 ↑U CLEAR
  429  003 363  	NECQUO,,NEQUOT!NEMETA	;026 ↑V Quote with β
  430  003 363  	NECQUO,,NEQUOT!NECTRL!NEMETA
  431           				;027 ↑W Quote with αβ
  432           	200+"K"			;030 ↑X αK
  433           	200+"L"			;031 ↑Y αL
  434           	211			;032 ↑Z αTAB
  435  003 382  	NECCNV!7,,175		;033 ↑[ ALT
  436  003 093  	NECDSP!10,,NEFLSH	;034 ↑\ Flush output queues
  437  003 380  	NECDSP!11,,DMBONG	;035 ↑] Undefined
  438  003 380  	NECDSP!12,,DMBONG	;036 ↑↑ Undefined
  439  003 380  	NECDSP!13,,DMBONG	;037 ↑← Undefined
  440           REPEAT 52-37,<
  441  003 407  	.-NECHAR		;040-052 Punctuation, unmodified
  442           >
  443  003 376  	NECNUM,,"+"		;053  + Controllified by ↑N
  444           	","			;054  ,
  445  003 376  	NECNUM,,"-"		;055  - Controllified by ↑N
  446           REPEAT 57-55,<
  447  003 407  	.-NECHAR		;056-057 Punctuation, unmodified
  448           >
  449           REPEAT 71-57,<
  450  003 407  	NECNUM,,.-NECHAR	;060-071 Digits, controllified by ↑N
  451           >
  452           REPEAT 174-71,<
  453  003 407  	.-NECHAR		;072-174 Unmodified ASCII chars
  454           >
  455  003 382  	NECCNV,,176		;175 Close brace converted ASCII/SAIL
  456  003 382  	NECCNV,,32		;176 Tilde converted ASCII/SAIL
  457           	577			;177 Rubout αBS
  458           
  459  003 407  NECVBP:	POINT 6,NECHAR(CHR),17	;BPT to variable char vector index
  460           
  461           >;IFN FTNOED
  462           IFE FTNOED,<
  463           ↑CHRMAC:JRST RTZERO		;No such UUO if no FTNOED
  464           ↑GETMAC:POPJ P,
  465           >;IFE FTNOED
                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 4␈↓'α
  001           ;TBSSET RAPPED NOINTR DMBPND LEWAIT DMSTAY DMXCAL DMQUOT TRUNCA NOEEOL NOEEOB BETWEE USERGO CHASTE PROTL
                ;E DMATXY DMXLE QUO177 DMUXFR BLNKON PROTON IDON DMUMSK CTRLCH DMTAPE
  002           
  003           ;DATAMEDIA INTERRUPT LEVEL (CH5) CODE: COMMENTS AND DEFS
  004           
  005           ;FIGURES OUT WHAT TEXT TO SEND OUT TO THE DM NEXT.
  006           ;UNQUOTED TTY CONTROL CHARS (BELOW 40) ARE SENT AS BLINKING LETTERS,
  007           ;ALTHOUGH THE HARDWARE MAY BE MODIFIED TO DISPLAY "BLINKING" CHARS AS BOLD
  008           ;AND VICE VERSA.  "BLINKING" HERE MEANS WHAT DATAMEDIA CORP. THINKS CAUSES BLINKING.
  009           
  010           ;   FLAGS in DAT:
  011           
  012           ;DM STATE FLAGS
  013           ;(RH of DAT, RH of DMFLAG(J))
  014           
  015           ↑TBSSET←←40000	;Tabs have been set
  016           ↑RAPPED←←20000	;Temporary flag: just passed last screen col, or need to skip LF
  017           ↑BELOW ←←10000	;This xfer is off screen or over line editor--suppress its output.
  018           ↑NOINTR←←1000	;Don't output anything but user program queue
  019           ↑DMBPND←←100	;There is a beep pending (or running) on this DM
  020           ↑LEWAIT←←40	;Only user program output is permitted while this bit is on
  021           ;;modes←←17	;See 4 mode flags below.
  022           ↑DMSTAY←←0	;Bits that don't get reset by ESC C and friends
  023           
  024           ;QUEUE ENTRY FLAGS
  025           ;(LH of DAT and RH of QFLAGS(TAC); LH of DMLEFL(J) for line editor xfers.)
  026           
  027           ↑DMXCAL←←200000	;Call routine in LH of QFREE(TAC) when xfer done
  028           ↑DMQUOT←←100000	;Don't interpret any text		
  029           ↑TRUNCA←←40000	;Ignore text beyond last col on display
  030           ↑NOEEOL←←20000	;Suppress erasing each old line before output on it
  031           ↑NOEEOB←←10000	;Suppress erasing of lines on which nothing is output but CRLF
  032           ↑BETWEE←←4000	;Ignore spaces between tabs and ending tab
  033           ↑USERGO←←2000	;Don't interrupt user program in progress
  034           ↑CHASTE←←1000	;No output (nor EEOL) done yet on current line
  035           ↑PROTLE←←400	;Don't overwrite the line editor's text (user program only)
  036           ↑DMATXY←←200	;Get and store X-Y position @QXYLOC
  037           ↑DMXLE←←100	;Line editor xfer--store final XY position at DMLEXY(J)
  038           ↑QUO177←←40	;Don't interpret 177's as quoting anything, just send them
  039           ↑DMUXFR←←20	;This is a user program transfer
  040           ;;modes←←17	;See 4 mode flags below.
  041           ;;Note that the CHASTE bit on in a user program header block flag word means
  042           ;; that any previously queued and unfinished user program should be flushed
  043           ;; immediately.  This flushes only those entries in the user program queue that
  044           ;; have a QXYLOC LH equal to <job number> in addition to having the DMXCAL
  045           ;; bit on.  Thus a job can flush any of the programs which that particular
  046           ;; job queued.
  047           ;;Note also that the DMATXY bit on in a user program header block flag word
  048           ;; means that when the user program finishes, any entries in the wholine
  049           ;; queue for this DM should be flushed (to establish cursor stability briefly).
  050           ;;Note also that the DMXLE bit on in a user program header block flag word
  051           ;; means that user program output is given highest priority until the given
  052           ;; user display program has finished.  Thus the line editor and page printer
  053           ;; cannot even start before the user program, much less interrupt it.
  054           
  055           ;The next four flags are used in both halves of DAT
  056           ;In LH, a one means Queue entry has set corresponding mode.
  057           ;In RH, a one means the DM is actually in the corresponding mode.
  058           
  059           ↑BLNKON←←10	;Blink mode
  060           ↑PROTON←←4	;Protected field mode
  061           ↑IDON←←2	;Insert/Delete mode
  062           
  063           ;This is the mask of user-settable flags
  064  004 035  ↑DMUMSK←←DMQUOT!TRUNCA!NOEEOL!NOEEOB!BETWEE!USERGO!PROTLE
  065           
  066           ;Special flag in RH of CHR indicating character is an arrow char (control char).
  067           CTRLCH←←400000	;Output this character as blinking
  068           DMTAPE←←200000	;Output this character preceded by ascii escape character
  069           
  070           ;Normally, an EEOL is output before the first character on a line, but this
  071           ;is inhibited if either DMQUOT or NOEEOL is on, or if NOEEOB is on and nothing
  072           ;printable (what's that mean, you ask?) has been output (CHASTE is on).
  073           
                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 5␈↓'α
  001           ;DMTABL dispatch table for quoted DM control characters
  002           
  003           ;Dispatch table for quoted control characters.
  004           ;These routines keep track of the X-Y position and the mode flags,
  005           ;and many of these routines do nothing but diddle these things without doing output.
  006           ;Therefore, it is necessary that any way out of this code save the DAT flags in
  007           ;QFLAGS(TAC) and DMFLAG(J).
  008           
  009           ;400000		;Means character need not be quoted on output to get special effect
  010           IDSPCL←←200000	;Special output char in I/D mode--doesn't change cursor position
  011           XYSPCL←←100000	;Special output char when seen just after FF (as X or Y position)
  012           INQUOT←←40000	;This character can be quoted on input by NULL or "add META".
  013           DMCONV←←20000	;This character normally gets converted to something else on input.
  014           PDADDR←←10000	;In ID mode, char is ADD ROW (for padding)
  015           PDDELR←←4000	;In ID mode, char is DEL ROW (for padding)
  016           ;;convertedchr←←777	;Bits in LH used to hold character we convert to on input.
  017           
  018           ;MASTER is the CLEAR character which clears the line editor.
  019           ;HOLDER is the HOLD character that holds PP output.
  020           ;These two chars' entries must be unique in the table below.
  021           
  022           DEFINE C(X) <↑X←←.-DMTABL>
  023           
  024  009 029  DMTABL:		DMXMT6			;000 NL	;↑@	;null--if it prints, put DMXMT5 here
  025  009 029  C(PADCHR)	DMXMT6			;001 ↓	;↑A	;no-op, used for padding
  026  010 044  C(HOME)	  XYSPCL,,DMHOME		;002 α	;↑B	;home
  027  009 029  	  DMCONV!INQUOT!600,,DMXMT6	;003 β	;↑C	;no-op
  028  014 004  C(LEMOVE)	DMLEMV			;004 ∧	;↑D	;no-op except for LE
  029  016 004  C(LEDELE)	DMLEDE			;005 ¬	;↑E	;no-op except for LE
  030  015 008  C(LEFIXT)	DMLEFX			;006 ε	;↑F	;no-op except for LE
  031  011 038  		DMBELL			;007 π	;↑G	;bell
  032  010 050  C(IDDELC) IDSPCL,,DMBACK		;010 ␈λ	;↑H	;back cursor (I/D: delete char)
  033  012 015  	  400000,,DMTAB			;011 TB	;↑I	;tab
  034  017 027  C(IDADDR) 400000!IDSPCL!PDADDR,,DMLF	;012 LF	;↑J	;lf (I/D: add row w/padding)
  035  009 029  		DMXMT6			;013 VT	;↑K	;tab clear, not allowed
  036  008 003  	  XYSPCL,,XYGET			;014 FF	;↑L	;set X-Y position
  037  017 021  	  400000,,DMCR			;015 CR	;↑M	;cr
  038  016 026  C(BLINK)	DMBLNK			;016 ∞	;↑N	;blink on
  039  016 025  C(PROTEC)	DMPROT			;017 ∂	;↑O	;protected field on
  040  016 032  C(ID)		DMID			;020 ⊂	;↑P	;I/D on
  041  009 029  	  XYSPCL,,DMXMT6		;021 ⊃	;↑Q	;transmit page, currently flushed
  042  009 029  	  XYSPCL,,DMXMT6		;022 ∩	;↑R	;transmit page to printer, currently flushed
  043  009 029  		DMXMT6			;023 ∪	;↑S	;transmit line, currently flushed
  044  009 029  		DMXMT6			;024 ∀	;↑T	;no-op
  045  009 029  		DMXMT6			;025 ∃	;↑U	;no-op
  046  009 029  		DMXMT6			;026 ⊗	;↑V	;no-op
  047  016 046  C(EEOL)		DMEEOL			;027 ↔	;↑W	;erase to end of line
  048  016 029  C(CANCEL) XYSPCL,,DMCANC		;030 _	;↑X	;cancel (unlock)
  049  009 029  		DMXMT6			;031 →	;↑Y	;set tab, not allowed
  050  016 036  C(IDDELR) DMCONV!IDSPCL!PDDELR!33,,DMUP	;032 ~	;↑Z	;up cursor (I/D: delete row)
  051  009 029  	  DMCONV!175,,DMXMT6		;033 ≠	;↑[	;no-op
  052  010 066  C(IDADDC) IDSPCL,,DMFORW		;034 ≤	;↑\	;forward cursor (I/D: add char)
  053  009 029  		DMXMT6			;035 ≥	;↑]	;roll on, not allowed
  054  010 034  C(MASTER) DMCONV!INQUOT!XYSPCL,,DMMAST	;036 ≡	;↑↑	;master clear--like home+erase+clears tabs
  055  010 036  C(HOLDER) DMCONV!INQUOT!XYSPCL,,DMERAS	;037 ∨	;↑←	;erase screen
  056  013 004  	  400000,,DMSPAC		;040 SP		;space
  057           ;Output escapes start at 41 and dispatch just like quoted control chars.
  058           ;There are currently no output escapes defined.
  059  005 022  C(OUTESC) ;Marks end of output escapes
                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 6␈↓'α
  001           ;PADID DM128 NO177 NOBOLD NODICU NBTSEQ DM2500 HP2648 TELERAY
  002           
  003           ;DPYDES flags, DPYBTS flags, AC usage, dpy hdr usage.
  004           
  005           ;Flag bits in Left half of DPYDES(LINE), carried here in LH of PROG.
  006           ;These flags describe the terminal-type of the display.
  007           PADID←←       1	;Need padding for I/D operations, using DM 2500 algorithm
  008           ↑DM128←←      2	;DM has special esc sequence mod to allow 128 chars displayed
  009           ↑NO177←←      4	;DM doesn't print 177s
  010           ↑NOBOLD←←    10	;DM doesn't have BOLD and BLINK hardware interchanged.
  011           
  012           
  013           ;Flag bits in Left half of DPYBTS(dpy hdr), carried here in LH of J.
  014           NODICU←←      1	;Cannot do arbitrary cursor positioning while in ID mode
  015           
  016           
  017           ;AC usage, dpy header cell usage.
  018           
  019           Comment ⊗  AC usage by DMXMT.  J, DDB, LINE are preserved, IOS only set to DEVIOS.
  020           IOS/	DEVIOS(DDB)	;used rarely
  021           TAC/	pointer to FS block for queue entry being output
  022           TAC1 (LINE)/ line characteristics and number
  023           P/	PDL pointer
  024           J/	DPYBTS(J),,LETAB(LINE)	;dpy-type bits,,dpy header address
  025           DAT/	queue entry flags,,display state flags
  026           DDB/	TTYTAB(LINE)	;TTY DDB address
  027           PROG/	DPYDES(J)	;dpy-type flags,,dpy descriptor block address
  028           TEM (CHR)/ character being output
  029           DSER/	byte pointer into quicky buffer
  030           UCHN/ (unused)
  031           PID/  (unused)
  032           UUO/  (unused)
  033           AC1/	temporary
  034           AC2/	temporary
  035           AC3/	X,,Y cursor position
  036           end of comment ⊗
  037           
  038           ;DPY HEADER CELLS FOR "QUICK" OUTPUT:
  039           ;DMQKCT count of bytes waiting for output
  040           ;DMQKPT byte pointer to waiting quick bytes
  041           ;DMQKBF buffer for quick output bytes, probably four words long
  042           ;	(must be able to hold: FF,X,Y,CANCEL,PROTECT,BLINK,ID,EEOL,8 SPACES)
  043           
  044           ;OTHER DPY HEADER CELLS
  045           ;UCOUNT
  046           ; <job>,,<address of user run flag to SOS (or SETZM?) when user dpy program is done>
  047           ;	(used by clock level routine which actually SOSes the cell)
  048           ;	(UCOUNT cell must be cleared by RESET; perhaps RESET should actually flush
  049           ;	  DM user dpy program and SOS the user cell before clearing UCOUNT.)
  050           ;DMLEPT	;Header of queue of Line Editor xfers
  051           ;DMSPPT	;Header of queue of SPecial xfers (holding message, setting tabs, DMEOSL)
  052           ;DMPPPT	;Header of queue of Page Printer xfers
  053           ;DMUSER	;Header of queue of USER display program xfers
  054           ;DMWHO	;Header of queue of WHOline xfers
  055           ;DMFLAG ;Flag word indicating current actual status of DM terminal
  056           ;DMXY	;Actual X-Y position of DM cursor
  057           ;DPYHGT	;Number of lines on display's screen (should be valid for any type of dpy)
  058           
  059           Comment ⊗ Display descriptor cells (reached via (PROG)):
  060           
  061           Many of these cells simply contain the output character sequences to carry out
  062           certain functions on the terminal.  In such Dpy Descriptor Cells, the chars
  063           are stored in up to four 9-bit bytes (high-order byte is output first),
  064           with the 400 bit of each byte flagging that that byte contains a char.  It is
  065           not legal to have a byte with the 400 bit on AFTER a higher-order byte that
  066           has the 400 bit off -- the first byte with the 400 bit off indicates that there
  067           are no more significant bytes in the word.
  068           
  069           If the whole word of an output sequence cell contains zero, then that means
  070           the given terminal cannot execute the given function.  (Some functions are
  071           required to be do-able by display terminals, other functions are optional.)
  072           
  073           DPCNAM	sixbit name of terminal
  074           DPCPOS	(LH) unused (RH) dispatch to routine to set arbitrary cursor position
  075           DPCHOM	output sequence to position cursor at Home (upper left)
  076           DPCEOL	output sequence to erase from cursor to end of line
  077           DPCPRT	output sequence to force next character to print
  078           DPCADC	output sequence to insert a character
  079           DPCDLC	output sequence to delete a character
  080           DPCFLS	output sequence to flush cursor
                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 6.1␈↓'α
  081           DPCRGH	output sequence to move right one column
  082           DPCLFT	output sequence to move left one column
  083           DPCUP	output sequence to move up one row
  084           DPCDWN	output sequence to move down one row
  085           DPCBEL	output sequence to ring the terminal's bell
  086           DPCERS	output sequence to erase terminal's screen
  087           DPCERB	(LH) must be zero (RH) bits for terminal states cleared by erase screen
  088           DPCADR	output sequence to add (insert) a blank row
  089           DPCDLR	output sequence to delete a row
  090           DPCCEM	output sequence to clear emphasis
  091           DPCSEM	output sequence to enable emphasis
  092           DPCMOD	(LH) must be zero (RH) bits for modes that must be right before output
  093           DPCBCL	(LH) must be zero (RH) bits for modes cleared by DPCMCC sequence
  094           DPCMCL	output sequence to clear modes in DPCMDC
  095           DPCID	output sequence to enable Insert/Delete mode
  096           DPCBLI	output sequence to enable blinking
  097           
  098           The standard ASCII commands CR and LF are assumed to behave normally on
  099           all displays supported by this code.  The CR is allowed to generate an
  100           automatic LF provided it also makes the terminal ignore an immediately
  101           following LF.  This code will never send a CR without an immediately
  102           following LF.
  103           
  104           end of comment ⊗
  105           
  106           NBTSEQ←←=9	;Number of bits per character in output sequences.
  107           		;The high-order bit is the valid bit -- consecutive chars
  108           		;from the sequence are output until a char is found
  109           		;that doesn't have the high-order bit on.  See DMOUT1.
  110           
  111           ;Macro to set up output sequence for carrying out a display terminal function.
  112           DEFINE DPC(A,B,C,D)<
  113  005 022    IFDIF <><D><BYTE (9)400!A,400!B,400!C,400!D
  114           ;>IFDIF <><C><BYTE (9)400!A,400!B,400!C
  115           ;>IFDIF <><B><BYTE (9)400!A,400!B
  116           ;>IFDIF <><A><BYTE (9)400!A
  117           >>;DPC	;Turns on 400 bit on all bytes up to last non-null one.
  118           
  119           DEFINE XX'(NAM)<IFDEF DPC'NAM,<.FATAL Multiply defined Dpy Descriptor Cell name>
  120  006 124  	DPC'NAM←←.-DM2500>	;Defines the names of the table offsets.
  121           
  122           ;Here is the Dpy Descriptor Table for the Datamedia 2500.
  123           ;All other terminals must have their tables in the same order.
  124           DM2500:
  125  006 120  xx(NAM)	'DM2500';name of terminal
  126  018 069  XX(POS)	DM25CU	;dispatch address for cursor positioning routine
  127  006 112  XX(HOM)	DPC(2)	;home command
  128  006 112  XX(EOL)	DPC(27)	;erase to end of line cmd
  129  006 112  XX(PRT)	DPC(33)	;force next character to print
  130  006 112  XX(ADC)	DPC(34)	;insert a space (assumes ID mode on)
  131  006 112  XX(DLC)	DPC(10)	;delete a character (assumes ID mode on)
  132  006 112  XX(FLS)	DPC(14)	;flush cursor from screen
  133  006 112  XX(RGH)	DPC(34)	;move right one column
  134  006 112  XX(LFT)	DPC(10)	;move left one column
  135  006 112  XX(UP)	DPC(32)	;move up one row
  136  006 112  XX(DWN)	DPC(12)	;move down one row
  137  006 112  XX(BEL)	DPC(7)	;ring the terminal's bell
  138  006 112  XX(ERS)	DPC(37)	;erase whole screen
  139  004 060  XX(ERB) 0,,BLNKON!PROTON!IDON ;bits for terminal states cleared by erase screen
  140  006 112  XX(ADR)	DPC(12)	;add (insert) a blank row
  141  006 112  XX(DLR)	DPC(32)	;delete a row
  142  006 112  XX(CEM)	DPC(30)	;clear emphasis
  143  006 112  XX(SEM)	DPC(16)	;enable emphasis (bold, assuming bold and blink are interchanged)
  144  004 060  XX(MOD)	BLNKON!PROTON!IDON ;bits for modes that must be right before output
  145  004 060  XX(BCL)	BLNKON!PROTON!IDON ;bits for modes cleared by DPCMCC sequence
  146  006 112  XX(MCL)	DPC(30)	;clear modes in DPCMDC
  147  006 112  XX(ID)	DPC(20)	;enable Insert/Delete mode
  148  006 112  XX(BLI)	DPC(17)	;enable blinking (assumes bold and blink are interchanged)
  149           
  150           ;Here is the Dpy Descriptor Table for the HP 2648A.
  151           HP2648:
  152           'HP2648'	;name of terminal
  153  018 081  HP26CU		;dispatch address for cursor positioning routine
  154  006 112  DPC(33,"H")	;home command
  155  006 112  DPC(33,"K")	;erase to end of line cmd
  156  006 112  DPC()		;force next character to print
  157  006 112  DPC(40)		;insert a space (assumes ID mode on)
  158  006 112  DPC(33,"P")	;delete a character (assumes ID mode on)
  159  006 112  DPC(33,"F")	;flush cursor from screen (home down)
  160  006 112  DPC(33,"C")	;move right one column
                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 6.2␈↓'α
  161  006 112  DPC(10)		;move left one column
  162  006 112  DPC(33,"A")	;move up one row
  163  006 112  DPC(12)		;move down one row
  164  006 112  DPC(7)		;ring the terminal's bell
  165  006 112  DPC(33,"H",33,"J") ;erase whole screen
  166           0		;bits for terminal states cleared by erase screen
  167  006 112  DPC(33,"L")	;add (insert) a blank row
  168  006 112  DPC(33,"M")	;delete a row
  169  006 112  DPC(33,"&","d","@") ;clear emphasis (reverse video)
  170  006 112  DPC(33,"&","d","B") ;enable emphasis (reverse video)
  171  004 061  BLNKON!IDON	;bits for modes that must be right before output
  172  004 059  BLNKON		;bits for modes cleared by DPCMCC sequence
  173  006 112  DPC(33,"&","d","@") ;clear modes in DPCMDC
  174  006 112  DPC(33,"Q")	;enable Insert/Delete mode (for inserting chars)
  175  006 112  DPC(33,"&","d","A") ;enable blinking
  176           
  177           ;Here is the Dpy Descriptor Table for the Teleray 1000 series.
  178           TELERAY:
  179           'TELERA'	;name of terminal
  180  018 109  TELECU		;dispatch address for cursor positioning routine
  181  006 112  DPC(33,"H")	;home command
  182  006 112  DPC(33,"K")	;erase to end of line cmd
  183  006 112  DPC()		;force next character to print
  184  006 112  DPC(33,"L")	;insert a space (assumes ID mode on)
  185  006 112  DPC(33,"M")	;delete a character (assumes ID mode on)
  186  006 112  DPC(33,"H")	;flush cursor from screen (home)
  187  006 112  DPC(33,"C")	;move right one column
  188  006 112  DPC(10)		;move left one column
  189  006 112  DPC(33,"A")	;move up one row
  190  006 112  DPC(12)		;move down one row
  191  006 112  DPC(7)		;ring the terminal's bell
  192  006 112  DPC(14)		;erase whole screen
  193           0		;bits for terminal states cleared by erase screen
  194  006 112  DPC(33,"P")	;add (insert) a blank row
  195  006 112  DPC(33,"Q")	;delete a row
  196           0		;clear emphasis (no emphasis possible, takes up char position)
  197           0		;enable emphasis (  "  )
  198           0		;bits for modes that must be right before output
  199           0		;bits for modes cleared by DPCMCC sequence
  200           0		;clear modes in DPCMDC
  201           0		;enable Insert/Delete mode
  202           0		;enable blinking
                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 7␈↓'α
  001           ;DMXMT DMXMG2 DMXMGO DMXMT0 DMXMTP DMXDEQ DMXMT1 DMXMT9 DMXMT2 DMXM8L DMXM8C DMXM8U DMNOXY DMXMT8 NODPYH
                ; NODPYH
  002           
  003           ↑DMXMT:	PUSH P,J		;Preserve J throughout DMXMT
  004           	SKIPN J,LETAB(LINE)
  005  007 119  	JRST NODPYH		;Can't get here without a dpy header
  006           	PUSH P,[POPJJ]		;Restore J when POPJing
  007           DMXMG2:	SOSGE DMQKCT(J)		;Any quick (uninterruptible) chars ready?
  008  007 012  	JRST DMXMT0		;No
  009           DMXMGO:	ILDB CHR,DMQKPT(J)
  010           	JRST TYPDM		;Yes, output one
  011           
  012           DMXMT0:	SKIPGE PADCNT(J)	;Do we now need to output some padding?
  013  007 032  	JRST DMXMTP		;Yes
  014           	SKIPGE RPTCNT(J)	;Is it time to repeat some sequence?
  015  007 023  	JRST DMXRPT		;Yes
  016           	HLL J,DPYBTS(J)		;Get display-dependent bits
  017           	SKIPN PROG,DPYDES(LINE)	;Get pointer to dpy descriptor block, more bits
  018           	PUSHJ P,NODPYD		;Oops, there isn't one!
  019           	PUSH P,[SCNONJ]		;Turn scanner on when done
  020           	OFFSCN			;But off while we diddle queue
  021  007 048  	JRST DMXMT1		;Look for something to output
  022           
  023           DMXRPT:	AOS RPTCNT(J)		;Count another repeat done
  024           	MOVE CHR,RPTSIZ(J)	;Number of chars in repeating string, minus one
  025           	MOVEM CHR,DMQKCT(J)	;Set up quicky output, avoiding immediate SOS
  026           	MOVE CHR,RPTPTR(J)	;Get byte pointer to string to repeat
  027           	MOVEM CHR,DMQKPT(J)	;And store for quicky output
  028           	MOVE CHR,RPTPAD(J)	;Get any padding count
  029           	HLLM CHR,PADCNT(J)	;And set it up again
  030  007 009  	JRST DMXMGO		;Go output first char
  031           
  032           DMXMTP:	MOVSI CHR,1		;Count one less padding char still needed
  033           	ADDB CHR,PADCNT(J)	;And send one now from RH of PADCNT
  034           	ANDI CHR,177		;No extra bits please
  035           	JRST TYPDM
  036           
  037           ;Any routine to be called when xfer is done (LH QFREE) better
  038           ; preserve J,TAC,TAC1,DDB.
  039  004 037  DMXDEQ:	TLNE DAT,DMXLE
  040           	MOVEM DAT,DMLEFL(J)	;Line editor xfer--store flags in dpy hdr
  041  004 033  	TLNE DAT,USERGO		;Just finish uninterruptible user program?
  042           	SETOM DMXY(J)		;Yes, don't for sure know where cursor is
  043           	HLRZ AC1,QFREE(TAC)	;Get address of routine to run now
  044  004 027  	TLNE DAT,DMXCAL		;Does this queue entry have routine to call?
  045           	PUSHJ P,(AC1)		;Yes
  046           	PUSHJ P,DMDEQ		;Unqueue request that finished
  047           	HRRZS DMFLAG(J)		;No old output going
  048           DMXMT1:	MOVE DAT,DMFLAG(J)	;Get flags
  049  004 020  	TDNE DAT,[USERGO,,NOINTR!LEWAIT] ;Uninterruptible user program in progress?
  050  007 062  	JRST DMXMT2		;Yes
  051           	HRRZ TAC,DMLEPT(J)	;Pointer to first LE incremental queue block
  052           	CAIE TAC,DMLEPT-QLINK(J) ;Header point to itself?
  053  009 003  	JRST DMXMTL		;No, output LE stuff
  054           DMXMT9:	HRRZ TAC,DMSPPT(J)	;Pointer to first special queue block
  055           	CAIE TAC,DMSPPT-QLINK(J) ;Header point to itself?
  056  009 023  	JRST DMXMTO		;No
  057           	SKIPE DPHOLD(J)		;Are we holding
  058  007 062  	JRST DMXMT2		;Yes, don't do any PP output
  059           	HRRZ TAC,DMPPPT(J)	;Pointer to first PP queue block
  060           	CAIE TAC,DMPPPT-QLINK(J) ;Header point to itself?
  061  009 023  	JRST DMXMTO		;No
  062           DMXMT2:	HRRZ TAC,DMUSER(J)	;Pointer to first user program queue block
  063           	CAIE TAC,DMUSER-QLINK(J) ;Header point to itself?
  064  009 008  	JRST DMXMUS		;No
  065  004 018  	TRNE DAT,NOINTR		;Suppressing all non-user-program xfers?
  066  007 111  	JRST DMXMT8		;Yes, no wholine, and don't reposition cursor
  067           	HRRZ TAC,DMWHO(J)	;Pointer to wholine queue block
  068           	CAIE TAC,DMWHO-QLINK(J)	;Header point to itself?
  069  009 023  	JRST DMXMTO
  070           ;No more queued requests. 
  071           ;Now we will leave the cursor wherever user or the line editor wants it.
  072           	SETZ CHR,		;For PTYUUO which expects 0 to mean no output
  073           	SKIPL AC3,DMUSXY(J)	;Any user-specified position?
  074  007 091  	JRST DMXM8U		;Yes
  075           DMXM8L:	SKIPE LECLK(J)		;If line editor is still working,
  076  007 111  	JRST DMXMT8		; don't bother moving cursor
  077           	MOVE AC3,CVP(J)		;Vertical position of LE cursor
  078  007 104  	SOJL AC3,DMNOXY		;LE counts lines from 1 but DM counts from 0
  079           	CAML AC3,DPYHGT(J)	;Is the vertical position on the screen?
                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 7.1␈↓'α
  080  007 104  	JRST DMNOXY		;No, flush cursor
  081           	HRL AC3,CHP(J)		;Horizontal position of LE cursor
  082           DMXM8C:	CAMN AC3,DMXY(J)	;Is cursor already there?
  083  007 111  	JRST DMXMT8		;Finally all done
  084  008 032  	PUSHJ P,DMSETQ		;Initialize quicky byte pointer and count
  085  018 003  	PUSHJ P,DMCURS		;Calculate FF,X,Y string to position cursor
  086           	MOVEM AC3,DMXY(J)	;Remember where we are putting cursor
  087           	MOVEM DAT,DMFLAG(J)	;Might have had to turn off ID mode (and others)
  088  007 007  	JRST DMXMG2		;Now output a char
  089           
  090           ;Here to leave cursor where user program wants it
  091           DMXM8U:	HRRZ AC1,PRGNUM(J)	;Get line number
  092           	MOVE IOS,DEVIOS(DDB)	;Maybe user program is not in charge of TTY
  093           	SKIPGE LETAB(AC1)	;Line initialized?
  094           	SKIPG CCPOS(J)		;Yes, cursor into line?
  095           	TLNE IOS,TPMON		;No, skip if user program in charge
  096  007 075  	JRST DMXM8L		;Yes, use line editor position
  097           	HLRZ AC1,AC3		;Use user-specified cursor position
  098           	HRRZ AC2,AC3
  099           	CAMGE AC1,DPYWID(J)	;Check for legal X position
  100           	CAML AC2,DPYHGT(J)	;Check for legal Y position
  101  007 104  	JRST DMNOXY
  102  007 082  	JRST DMXM8C		;Ok, now position cursor as user requested
  103           
  104           DMNOXY:	MOVSI AC3,707070	;Funny code to mark cursor gone (used here only)
  105           	CAMN AC3,DMXY(J)	;Cursor already gone?
  106  007 111  	JRST DMXMT8		;Yes, and we are too now
  107           	MOVEM AC3,DMXY(J)	;No, but it will be in a moment
  108           	MOVE CHR,DPCFLS(PROG)	;Char to erase cursor
  109           	JRST TYPDM		;Put out one last char
  110           
  111           DMXMT8:	MOVSI IOS,IO!TOIP!IRMA
  112           	ANDCAB IOS,DEVIOS(DDB)
  113           	LDB J,PJOBN		;Get job number of tty's owner
  114           	JUMPN J,CPOPJ		;Don't kill tty if in use
  115           	TLNN LINE,TLKRNG	; nor if in talk ring
  116           	PUSHJ P,TTYKIL
  117           	POPJ P,
  118           
  119           NODPYH:	POP P,J
  120           	PUSHACS
  121           	PUSHJ P,DISGST		;PRINT TIME OF NEW MESSAGE ON CTY
  122           	PUSHJ P,DISMES
  123           	ASCIZ /NO DPY HEADER FOR DATAMEDIA LINE AT DMXMT.
  124           /
  125           	PUSHJ P,DISFLU
  126           	POPACS
  127           	PUSHJ P,WDDTCA
  128           	JRST NODPY2
  129           
  130           NODPYH:	PUSHACS
  131           	PUSHJ P,DISGST		;PRINT TIME OF NEW MESSAGE ON CTY
  132           	PUSHJ P,DISMES
  133           	ASCIZ /No DPY DESCRIPTOR for DM line at DMXMT.
  134           /
  135           	PUSHJ P,DISFLU
  136           	POPACS
  137           	PUSHJ P,WDDTCA
  138           	MOVEI PROG,DMDPYD	;Make this a normal DM 2500
  139           	MOVEM PROG,DPYDES(LINE)
  140           	POPJ P,
                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 8␈↓'α
  001           ;XYGET XYGET2 XYCHK DMSETQ
  002           
  003           XYGET:	SOSGE QDMCNT(TAC)
  004  007 039  	JRST DMXDEQ		;OOPS, end of entry.
  005  008 021  	PUSHJ P,XYCHK		;See if legal X char
  006           	CAML CHR,DPYWID(J)
  007           	TDZA AC1,AC1		;Out of range, use column 0
  008           	MOVEI AC1,(CHR)		;Save X while checking Y
  009           	SOSGE QDMCNT(TAC)
  010  007 039  	JRST DMXDEQ		;OOPS, end of entry.
  011  008 021  	PUSHJ P,XYCHK		;See if legal Y char
  012           	CAML CHR,DPYHGT(J)
  013           	MOVEI CHR,0		;Out of range, use line 0
  014           	HRL CHR,AC1
  015           	MOVEM CHR,QXY(TAC)
  016  004 037  	TLNN DAT,DMXLE
  017  004 034  	TLOA DAT,CHASTE		;New virgin output line waiting
  018           	MOVEM CHR,DMLEXY(J)	;Make sure line editor knows where we are
  019  009 029  	JRST DMXMT6
  020           
  021           XYCHK:	ILDB CHR,QTAKR(TAC)	;Get X or Y position
  022           	CAIL CHR,40
  023           	TRCA CHR,140
  024  005 024  	SKIPA AC2,DMTABL(CHR)
  025           	POPJ P,
  026           	AOS (P)			;Control-chars are out of range for both X and Y.
  027  005 011  	TLNN AC2,XYSPCL		;Is this a special char in X-Y position setting?
  028           	POPJ P,			;No
  029           	SUB P,[1,,1]		;Don't return to XYGET
  030  011 021  	JRST DMXMT4		;Now go process this special char
  031           
  032           ↑DMSETQ:MOVEI DSER,DMQKBF(J)
  033           	HRLI DSER,440700	;Initialize byte pointer for storing quicky output
  034           	MOVEM DSER,DMQKPT(J)	;Set up taker byte pointer, too.
  035           	SETZM DMQKCT(J)		;No quickies yet
  036           	POPJ P,
                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 9␈↓'α
  001           ;DMXMTL DMXMUS DMXMTO DMXMTM DMLEM5 DMXMT6 DMXMT3 DMXMT5 DMTAB3 DMNOOP DMNOO2 DMXM5A DMXM5B DMXM5X DMCR2
                ; DMLF4 DMXM5D SKIPCR RANGE0 RANGE
  002           
  003           DMXMTL:	HLL DAT,DMLEFL(J)	;Get line editor flags
  004           	SKIPE LETXC(J)		;Has LE text already changed?
  005  007 039  	JRST DMXDEQ		;Yes, just dequeue this xfer
  006  009 024  	JRST DMXMTM
  007           
  008  004 018  DMXMUS:	TRNN DAT,NOINTR		;Want this xfer sent uninterruptibly?
  009  009 023  	JRST DMXMTO		;Nope, normal user xfer
  010           	HRL DAT,QFLAGS(TAC)	;Get flags for this xfer
  011  004 028  	TLNE DAT,DMQUOT		;Want to be interpreted?
  012  004 039  	TLZN DAT,DMUXFR		;No, have we already sent this xfer?
  013  009 024  	JRST DMXMTM		;Yes
  014           	HLRM DAT,QFLAGS(TAC)	;No, but note we will have in a moment
  015           	MOVE AC1,QTAKR(TAC)	;Get byte pointer to text of xfer
  016           	MOVEM AC1,DMQKPT(J)	; and use it for quickies
  017           	MOVE AC1,QDMCNT(TAC)	;Get byte count
  018           	MOVEM AC1,DMQKCT(J)	; and use it for quickies
  019           	SETOM DMXY(J)		;Note we have lost track of cursor
  020           	SETZM QDMCNT(TAC)	;Make sure xfer flushed when quicky buffer empties
  021  007 007  	JRST DMXMG2		;All set up, now start transmitting quickies
  022           
  023           DMXMTO:	HRL DAT,QFLAGS(TAC)	;Get flags for this transfer
  024  008 032  DMXMTM:	PUSHJ P,DMSETQ		;Initialize quicky output byte ptr and byte count
  025  004 036  	TLNN DAT,DMATXY		;X-Y position stored in special word?
  026  009 029  	JRST DMXMT6
  027           	MOVE AC3,@QXYLOC(TAC)	;Yes, get X-Y position
  028           DMLEM5:	MOVEM AC3,QXY(TAC)	;Put into queue entry for use here
  029           DMXMT6:	SOSGE QDMCNT(TAC)	;Decrement number of characters in the entry
  030  007 039  	JRST DMXDEQ		;End of queue entry
  031           DMXMT3:	ILDB CHR,QTAKR(TAC)	;Get next character
  032  009 029  	JUMPE CHR,DMXMT6	;Ignore null not preceded by 177
  033           	MOVE AC3,QXY(TAC)	;Save X-Y position we are supposed to be at.
  034           	CAIN CHR,177
  035  011 008  	JRST DM177		;This is an escape or quoted char
  036  004 028  	TLNE DAT,DMQUOT		;Quoting most everything?
  037  011 004  	JRST DMXMT7		;Yes
  038           	CAIL CHR,175
  039  010 075  	JRST DM175-175(CHR)	;Special dispatch on 175, 176
  040           	CAIN CHR,32
  041           	TRCA CHR,32≠176		;Map Stanford tilde to ASCII tilde
  042           	CAILE CHR,40		;Control char or space?
  043  009 054  	JRST DMXMT5		;No, just update X-Y and send the char
  044  005 024  	SKIPGE AC2,DMTABL(CHR)	;This char automatically quoted?
  045  011 021  	JRST DMXMT4		;Yes, output control char (or check for space)
  046           	CAIN CHR,"≠"
  047           	MOVEI CHR,32		;Turn not-equals sign into ↑Z, to match input rep.
  048  006 008  	TLNE PROG,DM128		;Can this DM tty display control characters?
  049  004 068  	JRST [	TRO CHR,DMTAPE	;Yes, use single-char tape mode to display char
  050  009 054  		JRST DMXMT5]
  051           	CAIG CHR,32
  052  004 067  	TROA CHR,140!CTRLCH	;Use lower case for control-letters
  053  004 067  	TRO CHR,100!CTRLCH	;Use "upper case" for control-funny-chars
  054           DMXMT5:	HLRZ AC2,AC3		;Get column position
  055           	ADDI AC2,1
  056           	HRLM AC2,QXY(TAC)
  057           DMTAB3:	CAML AC2,DPYWID(J)
  058  004 016  	TRO DAT,RAPPED		;Moved past end of line
  059  009 108  IFN FTRANGE,< JSP AC1,RANGE >	;Don't return if this is a user xfer out of range
  060  018 133  DMNOOP:	PUSHJ P,DMPREP		;Make sure cursor is at right place w/right modes
  061  004 034  DMNOO2:	TLZE DAT,CHASTE		;Any previous output on this line?
  062  004 030  	TLNE DAT,DMQUOT!NOEEOL	;No, suppressing erasures?
  063  009 066  	JRST DMXM5A		;Yes to one of these
  064           	MOVE AC2,DPCEOL(PROG)	;Erase to end-of-line char sequence
  065  018 125  	PUSHJ P,DMOUT1		;Erase new line
  066  004 068  DMXM5A:	TRZN CHR,DMTAPE		;Is this a control char on DM that can display it?
  067  009 070  	JRST DMXM5B		;No
  068           	MOVE AC2,DPCPRT(PROG)	;Yes, tell terminal to print next char
  069  018 125  	PUSHJ P,DMOUT1		;Output the char sequence
  070           DMXM5B:	IDPB CHR,DSER		;Put in real character (but don't count it)
  071  004 016  DMXM5X:	TRZN DAT,RAPPED		;Did we just pass last column on screen?
  072  009 083  	JRST DMXM5D		;No
  073           	AOS DMQKCT(J)		;Count following CR as quicky
  074  004 029  	TLNE DAT,TRUNCA		;Want to suppress stuff beyond last screen col?
  075  010 004  	PUSHJ P,IGNOR0		;Yes, look for CR or LF--skip return unless hit CR
  076  009 097  DMCR2:	 PUSHJ P,SKIPCR		;Skip over any following CRs and/or LF
  077           	MOVEI AC1,15		;Clear DM hardware flags by sending actual CRLF now
  078           	IDPB AC1,DSER
  079           	AOS DMQKCT(J)		;Count following LF as quicky
                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 9.1␈↓'α
  080  017 003  	PUSHJ P,DMCR3		;Adjust X-Y position to beginning of next line
  081           DMLF4:	MOVEI AC1,12
  082           	IDPB AC1,DSER
  083           DMXM5D:	MOVEM DAT,DMFLAG(J)	;Save DM state flags
  084           	HLRM DAT,QFLAGS(TAC)	;Save transfer dependent flags
  085  004 037  	TLNE DAT,DMXLE
  086           	MOVEM DAT,DMLEFL(J)	;Line editor xfer--store flags in dpy hdr
  087           	MOVE AC1,QXY(TAC)
  088  004 036  	TLNE DAT,DMATXY		;Is X-Y position stored somewhere special?
  089           	MOVEM AC1,@QXYLOC(TAC)	;Yes, store X-Y position there
  090  004 017  	TRNE DAT,BELOW		;Is this transfer off screen?
  091  007 048  	JRST DMXMT1		;Yes, don't output it, just look for more work
  092           	MOVEM AC1,DMXY(J)	;Save DM actual position
  093           	SKIPG DMQKCT(J)		;Did we set up any quickies?
  094           	JRST TYPDM		;No, just output one char
  095  007 009  	JRST DMXMGO		;Avoid one AOS and immediate SOS--output quickies
  096           
  097           SKIPCR:	SOSGE QDMCNT(TAC)
  098           	POPJ P,			;Nothing left in xfer
  099           	ILDB AC1,QTAKR(TAC)
  100           	CAIN AC1,15
  101  009 097  	JRST SKIPCR		;Ignore all CRs
  102           	CAIE AC1,12
  103  010 028  	JRST IGNFF		;Not CR or LF, put it back
  104           	POPJ P,			;Ignore one LF
  105           
  106           IFN FTRANGE,<
  107           RANGE0:	HLRZ AC2,AC3		;Get current column
  108  004 039  RANGE:	TLNE DAT,DMUXFR		;User program xfer?
  109  004 061  	TLNE DAT,IDON		;Yes, but don't suppress output in ID mode
  110           	JRST (AC1)		;Don't suppress
  111           	CAML AC2,DMBEG(J)	;Before beginning of range?
  112           	CAMLE AC2,DMEND(J)	;Or after end of range?
  113  004 017  	TROA DAT,BELOW		;Yes, out of range--flag xfer as off screen
  114           	JRST (AC1)		;Don't suppress
  115  009 071  	JRST DMXM5X		;Don't try to erase if suppressing output
  116           >;FTRANGE
                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 10␈↓'α
  001           ;IGNOR0 IGNOR3 IGNOR2 IGNFF DMMAST DMERAS DMHOME DMBACK DMFOR2 DMFORW DM175 DM177B
  002           
  003           ;Routine to skip text beyond last screen col until CR, LF, or FF.  Skips on CR.
  004           IGNOR0:	AOS (P)			;Assume skip return
  005           IGNOR3:	SOSGE QDMCNT(TAC)	;Here to skip text beyond last screen col
  006           	POPJ P,			;Nothing to ignore
  007           	ILDB AC1,QTAKR(TAC)
  008           	CAIN AC1,15
  009           	SOSA (P)		;Direct return to skip any following CRs and/or LF
  010           	CAIN AC1,12
  011           	POPJ P,			;All done for sure
  012  004 028  	TLNE DAT,DMQUOT		;Quoting everything?
  013  010 026  	JRST IGNOR2		;Yes
  014  004 038  	TLNN DAT,QUO177		;Are 177's themselves quoted?
  015           	CAIE AC1,177		;No, quoting next char?
  016  010 005  	JRST IGNOR3		;No
  017           	SKIPG QDMCNT(TAC)	;Peek at char after 177 to look for FF
  018           	POPJ P,			;Nothing is being quoted
  019           	MOVE AC2,QTAKR(TAC)
  020           	ILDB AC1,AC2
  021           	CAIE AC1,14
  022  010 005  	JRST IGNOR3
  023  010 028  	JRST IGNFF		;Back up byte pointer and byte count over the 177
  024           
  025           ;Here if quoting everything
  026           IGNOR2:	CAIE AC1,14
  027  010 005  	JRST IGNOR3		;Loop back and ignore more
  028           IGNFF:	MOVSI AC1,070000
  029           	ADDM AC1,QTAKR(TAC)	;Back up byte pointer so we'll see same char again
  030           	AOS QDMCNT(TAC)		;Fix up count too
  031           	POPJ P,
  032           
  033           ;For now, master clear just pretends tabs are gone and does erase of screen.
  034  004 015  DMMAST:	TRZ DAT,TBSSET		;This will clear all tabs, unfortunately
  035           ;Here to erase display screen.
  036           DMERAS:	PUSHJ P,DMFORC		;Force whole wholine out next time
  037           	SETZM QXY(TAC)		;Back to home corner with all modes cleared
  038  004 017  	TDZ DAT,[BLNKON!PROTON!IDON,,BELOW]
  039           	TDZ DAT,DPCERB(PROG)	;Clear bits for terminal states cleared by erase
  040  004 034  	TLO DAT,CHASTE		;New virgin output line waiting
  041           	MOVE AC2,DPCERS(PROG)	;Get output sequence to erase screen
  042  016 048  	JRST DMLED1		;Output it the usual way
  043           
  044           DMHOME:	SETZM AC1,QXY(TAC)	;Back to home corner with all modes cleared
  045  004 061  	TLZ DAT,BLNKON!PROTON!IDON
  046  004 034  	TLO DAT,CHASTE		;New virgin output line waiting
  047  016 041  	JRST DMFOR3		;Store flags and maybe X-Y position
  048           
  049           	DPCDLC(PROG)		;Ptr to output seq to delete char if in ID mode
  050           DMBACK:	HLRZ AC2,AC3
  051  009 029  	SOJL AC2,DMXMT6		;Can't back up past left margin, get next char
  052           DMFOR2:	HRLM AC2,QXY(TAC)	;Store new X position
  053  004 036  	TLNE DAT,DMATXY		;Is X-Y position stored somewhere special?
  054           	HRLM AC2,@QXYLOC(TAC)	;Yes, store new X position there
  055  009 029  	JRST DMXMT6		;Get next char from this xfer
  056           REPEAT 0,<	;For now we'll just remember where xfer wants the cursor
  057  018 133  	PUSHJ P,DMPREP		;Get cursor positioned to old place
  058           	MOVE AC2,DMCLFT(PROG)	;Get output sequence for moving left
  059  018 125  	PUSHJ P,DMOUT1		;And output it
  060           	SOS DMQKCT(J)		;As usual, don't count one quicky
  061           	LDB CHR,DSER		; ...and get back last output char
  062  009 083  	JRST DMXM5D
  063           >;REPEAT 0
  064           
  065           	DPCADC(PROG)		;Ptr to output seq to insert char if in ID mode
  066           DMFORW:	HLRZ AC2,AC3		;Get current X position
  067           	ADDI AC2,1		;Move right one column
  068           	CAMGE AC2,DPYWID(J)	;Does this make us pass end of line?
  069  010 052  	JRST DMFOR2		;No, just store new X position
  070  017 003  	PUSHJ P,DMCR3		;Back to col 0 on next line
  071           	MOVE AC1,QXY(TAC)	;Get new X-Y position for xfer
  072  016 041  	JRST DMFOR3		;Store it in special place if necessary
  073           
  074           ;The next two words are JRSTed to for output of chars 175, 176 respectively.
  075           DM175:	MOVEI CHR,45		;175: Output altmode as dollar sign (44, sic)
  076  009 054  	SOJA CHR,DMXMT5		;176: Right brace -- becomes ASCII 175
  077           
  078  006 008  DM177B:	TLNN PROG,NO177!DM128	;Does this DM print 177s?
  079  009 054  	JRST DMXMT5		;Yes, just send it
  080  006 008  	TLNE PROG,DM128		;Can we precede it with a 033?
                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 10.1␈↓'α
  081  004 068  	TROA CHR,DMTAPE		;Yes, flag it
  082  004 067  	MOVEI CHR,137!CTRLCH	;No, use inverted intensity left arrow
  083  009 054  	JRST DMXMT5		;Now output it
                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 11␈↓'α
  001           ;DMXMT7 DM177 DMXM4A DMXMT4 DMCALC DMBELL DMCHPD DM30PD DM30PA DM30PB DM25PA DM25PB DMCALX DMPADM
  002           
  003           ;Here if DMQUOT is on and char is neither 177 nor 0.
  004           DMXMT7:	CAIL CHR,40
  005  009 054  	JRST DMXMT5		;Normal char, just output it
  006  011 020  	JRST DMXM4A
  007           
  008  004 038  DM177:	TLNE DAT,QUO177		;177: Is it quoting next char?
  009  010 078  	JRST DM177B		;No, it is itself quoted--just send it
  010           	SOSGE QDMCNT(TAC)	;Here to quote next character
  011  007 039  	JRST DMXDEQ		;WHAT! Nothing there to quote!
  012           	ILDB CHR,QTAKR(TAC)
  013           	CAIN CHR,177
  014  010 078  	JRST DM177B		;Here we have a quoted 177
  015           	CAIGE CHR,175		;Quotable text char?
  016           	CAIN CHR,40		;Space can be quoted
  017  009 054  	JRST DMXMT5		;Yes, update X-Y position and send char
  018           	CAIL CHR,OUTESC		;Control character or escape command?
  019  009 029  	JRST DMXMT6		;No, ignore for now, allowing expansion of escapes
  020  005 024  DMXM4A:	MOVE AC2,DMTABL(CHR)	;Yes, dispatch to special routine
  021  005 010  DMXMT4:	TLNE AC2,IDSPCL		;Special char in I/D mode?
  022  004 061  	TLNN DAT,IDON		;Yes, are we in I/D mode?
  023           	JRST (AC2)		;No, go to special routine
  024  018 133  	PUSHJ P,DMPREP		;Make sure cursor and modes are correct
  025           	MOVE AC2,@-1(AC2)	;Get output sequence for insert/delete operation
  026  018 125  	PUSHJ P,DMOUT1		;And output it
  027           	SOS DMQKCT(J)		;Don't count one quicky, as usual
  028  005 024  	MOVE AC2,DMTABL(CHR)	;Get bits for char again
  029           	LDB CHR,DSER		;Get back last quicky output char, for DMXM5D
  030  006 007  	TLNN PROG,PADID		;Need padding? (If so, assume DM 2500 algorithm)
  031  009 083  	JRST DMXM5D		;No
  032  011 065  	MOVEI AC1,DM25PA	;Routine to pad quick I/D operations on 2500
  033  005 014  	TLNE AC2,PDADDR		;ADD ROW char?
  034  011 071  	MOVEI AC1,DM25PB	;Yes, use routine to pad slower operation
  035           DMCALC:	LDB AC2,DMBAUD		;Get actual DMs running baud rate
  036           	JRST (AC1)		;Call routine to calculate padding
  037           
  038           DMBELL:	MOVE AC2,DPCBEL(PROG)	;Get bell-ringing output sequence
  039  018 125  	PUSHJ P,DMOUT1		;Output it
  040           	LDB CHR,DSER		;Get back last char of sequence
  041           	SOS DMQKCT(J)		;Don't really count one quicky, as usual
  042           	LDB AC2,DMBAUD		;Get baud rate
  043           	IMULI AC2,=250		;Pad for 250 msec
  044           DMCHPD:	IDIVI AC2,B10000	;Make number of character transmission times
  045  011 078  	JUMPN AC3,DMCALX	;Jump if any remainder (use original char time)
  046  011 078  	SOJA AC2,DMCALX		;Minus one for the original char
  047           
  048           REPEAT 0,<	;For now, use no padding on 3025s
  049  011 055  DM30PD:	MOVEI AC1,DM30PA	;Routine to pad quick I/D operations on 3025
  050  005 015  	TLNE AC2,PDADDR!PDDELR	;Add or delete row?
  051  011 059  	MOVEI AC1,DM30PB	;Yes, use routine from slower operations
  052  011 035  	JRST DMCALC		;Now calculate padding
  053           
  054           ;Routine to calculate padding for ADD/DEL CHAR on DM 3025.
  055           DM30PA:	IMULI AC2,6		;It takes 6 msec for the 3025 to do these ops
  056  011 044  	JRST DMCHPD
  057           
  058           ;Routine to calculate padding for ADD/DEL ROW on DM 3025.
  059           DM30PB:	IMULI AC2,=130		;It takes 130 msec for the 3025 to do these ops
  060  011 044  	JRST DMCHPD
  061           >;REPEAT 0
  062           
  063           ;Routine to calculate padding for all I/D ops except ADD ROW on DM 2500.
  064           ;Pentti's algorithm for quick ops.
  065           DM25PA:	IMULI AC2,3		;Takes 3 character transmission times at 9600
  066           	IDIVI AC2,BD9600	;Divide by 9600 baud
  067  011 078  	SOJA AC2,DMCALX		;Minus one for the original char
  068           
  069           ;Routine to calculate padding for ADD ROW on DM 2500.
  070           ;Another Pentti Kanerva algorithm
  071           DM25PB:	MOVNI AC1,(AC3)		;Negative of number of lines above cursor
  072           	ADDI AC1,=24+6		;Make it number of lines from here down + 6
  073           	IMUL AC2,AC1		;Times baud rate
  074           ;	SUBI AC2,BD2400		; minus 2400
  075           	ADDI AC2,BD9600+BD4800-1 - BD2400 ; minus 2400, but force ceiling rounding
  076           	IDIVI AC2,BD9600+BD4800	;Divided by 14400
  077           ;Padding calculation routines all exit through here
  078  009 083  DMCALX:	JUMPLE AC2,DMXM5D	;Jump if no padding needed
  079           	CAILE AC2,8		;Quicky buffer has room for 8 (eg, expanding tab)
  080  011 087  	JRST DMPADM		;Lots of padding needed, use different method
                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 11.1␈↓'α
  081           	ADDM AC2,DMQKCT(J)	;Count more quickies for padding
  082           	MOVE AC1,PADCNT(J)	;Padding char
  083           	IDPB AC1,DSER		;Put padding chars into quicky buffer
  084           	SOJG AC2,.-1
  085  009 083  	JRST DMXM5D
  086           
  087           DMPADM:	MOVNI AC2,(AC2)		;Make count negative
  088           	HRLM AC2,PADCNT(J)	;Set up arbitrary padding count
  089  009 083  	JRST DMXM5D
                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 12␈↓'α
  001           ;DMBETW DMBET2 DMTAB DMSPA9 DMSPA8 DMTABC
  002           
  003           DMBETW:	SOSGE QDMCNT(TAC)
  004  012 012  	JRST DMBET2		;Oops, ran out of text
  005           	ILDB CHR,QTAKR(TAC)	;Get next char
  006           	CAIN CHR,11
  007           	POPJ P,			;Found ending tab
  008           	CAIN CHR,40
  009  012 003  	JRST DMBETW		;Ignore this space
  010  012 003  	JUMPE CHR,DMBETW	;Ignore nulls too
  011  010 028  	PUSHJ P,IGNFF		;Strange char, put it back
  012           DMBET2:	MOVEI CHR,11		;Set up actual tab again
  013           	POPJ P,
  014           
  015  004 032  DMTAB:	TLNE DAT,BETWEE		;Want to skip spaces between tabs?
  016  012 003  	PUSHJ P,DMBETW		;Yes
  017           DMSPA9:	HLRZ AC1,AC3		;Get column position
  018           	MOVEI AC2,10(AC1)
  019           	ANDI AC2,-10		;Make it multiple of 8
  020           	HRLM AC2,QXY(TAC)	;Store new column position
  021           	CAIL AC1,=72
  022           ;The following instr will fail to put out a quoted tab!!!!!
  023  009 057  	JRST DMTAB3		;Wrapping around, omit tab and put out CRLF
  024           ;Note--If this tab is quoted, we will very probably screw up X-Y position
  025           ;iff the tab stops are not really where we expect them--tough.
  026  004 028  	TRNE DAT,TBSSET!DMQUOT	;Can we output actual tab?
  027  009 057  	JRST DMTAB3		;Yes
  028           	MOVEI CHR,40		;No, use spaces
  029           	SUBI AC1,-1(AC2)	; - (number of spaces needed - 1)
  030  009 057  DMSPA8:	JUMPE AC1,DMTAB3	;If just one space, pretend normal space
  031  009 108  IFN FTRANGE,< JSP AC1,RANGE >	;Don't return if this xfer is out of range
  032  018 133  	PUSHJ P,DMPREP		;Make sure cursor and modes are setup
  033           	HLRZ AC2,QXY(TAC)	;New column position
  034           	HLRZ AC1,AC3		;Old column position
  035           	SUBI AC2,1(AC1)		;Number of spaces - 1
  036           	ADDM AC2,DMQKCT(J)	;Count all spaces but 1 as quickies
  037           	IDPB CHR,DSER
  038           	SOJG AC2,.-1		;Put out 1 to 7 spaces (save one for later)
  039  009 061  	JRST DMNOO2
  040           
  041           REPEAT 0,<	;Diddling tabs is no longer allowed.
  042  004 015  DMTABC:	TRZ DAT,TBSSET		;Someone is diddling our tabs--remember that
  043  009 060  	JRST DMNOOP		;But it doesn't move the cursor
  044           >;REPEAT 0
                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 13␈↓'α
  001           ;DMSPAC DMSPA4 DMSPA2 DMSPA3
  002           
  003           ;We don't get here with quoted spaces.
  004  004 030  DMSPAC:	TLNE DAT,NOEEOL		;Can we erase line and convert spaces to tabs?
  005  009 054  	JRST DMXMT5		;Nope
  006           	TLC AC3,7
  007           	TLCE AC3,7		;Only one space to next tab stop?
  008  004 015  	TRNN DAT,TBSSET		;Or tabs not set?
  009  009 054  	JRST DMXMT5		;Yes to one of these
  010           	HLRZ AC2,AC3		;Get previous X position
  011           	ADDI AC2,1		;Update X position for first space
  012           DMSPA4:	SOSGE QDMCNT(TAC)
  013  013 021  	JRST DMSPA2		;Nothing left in queue entry--go put out spaces
  014           	ILDB CHR,QTAKR(TAC)
  015           	CAIN CHR,11		;If its a tab, just ignore preceding spaces
  016  012 015  	JRST DMTAB
  017           	CAIN CHR,40
  018  013 026  	JRST DMSPA3		;Collect spaces until hit a tab stop
  019  010 028  	PUSHJ P,IGNFF		;Back up byte pointer and count over this last char
  020           	MOVEI CHR,40		;Now go put out number of spaces we have accumulated
  021           DMSPA2:	HRLM AC2,QXY(TAC)	;Store new X position
  022           	HLRZ AC1,AC2		;Number of "extra" spaces
  023           	MOVEI AC2,(AC2)		;New X position
  024  012 030  	JRST DMSPA8		;Put out extras
  025           
  026           DMSPA3:	AOBJN AC2,.+1
  027           	TRNE AC2,7		;Have we reached a tab stop?
  028  013 012  	JRST DMSPA4		;No
  029           	MOVEI CHR,11		;Yes, simulate these spaces with a tab
  030  012 017  	JRST DMSPA9
                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 14␈↓'α
  001           ;DMLEMV DMLEM2 DMLEM3 DMLEM4
  002           
  003           ;Here to adjust cursor position for line editor.
  004  004 037  DMLEMV:	TLNN DAT,DMXLE		;Only valid for line editor xfer
  005  009 029  	JRST DMXMT6		;Not legal otherwise
  006           	SOSGE QDMCNT(TAC)
  007  007 039  	JRST DMXDEQ		;Missing arg!
  008           	ILDB AC1,QTAKR(TAC)	;Get low-order bits of X adjustment
  009           	SOSGE QDMCNT(TAC)
  010  007 039  	JRST DMXDEQ		;Missing arg!
  011           	ILDB AC2,QTAKR(TAC)	;Get high-order bits of X adjustment
  012           	DPB AC2,[POINT 7,AC1,28];Combine bytes in AC1
  013           	TRNE AC1,1B22		;Negative number?
  014           	IOR AC1,[-1B22]		;Yes, extend sign bit
  015           	HLRZ AC2,AC3		;Get starting X position
  016           	ADD AC1,AC2		;Adjust it
  017  014 021  DMLEM2:	JUMPGE AC1,DMLEM3	;Jump unless moved past left margin
  018           	ADD AC1,DPYWID(J)
  019  014 017  	SOJA AC3,DMLEM2		;Back up a line
  020           
  021           DMLEM3:	CAMGE AC1,DPYWID(J)	;Pass right margin?
  022  014 026  	JRST DMLEM4		;No
  023           	SUB AC1,DPYWID(J)
  024  014 021  	AOJA AC3,DMLEM3		;Move down a line
  025           
  026           DMLEM4:	HRL AC3,AC1		;Combine new X and Y positions
  027           	MOVEM AC3,DMLEXY(J)	;Store new X-Y position in dpy hdr
  028  009 028  	JRST DMLEM5		;Now store X-Y in queue entry and get another char
                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 15␈↓'α
  001           ;DMLEFX
  002           
  003           ;Routine for line editor -- inserts or deletes some spaces away from cursor.
  004           ;First arg is numbers of chars to insert or delete, with 100 bit on iff
  005           ;deleting; 40 bit of first arg is high-order bit of offset, whose low
  006           ;seven bits are in the second arg -- the offset from LE cursor where
  007           ;inserting or deleting is to take place.
  008  004 037  DMLEFX:	TLNN DAT,DMXLE		;This is only legal if from line editor
  009  009 029  	JRST DMXMT6		;Not legal otherwise
  010           	SOSGE QDMCNT(TAC)
  011  007 039  	JRST DMXDEQ		;Missing arg
  012           	ILDB AC2,QTAKR(TAC)	;Get first arg
  013           	TRZE AC2,100		;Deleting or adding chars?
  014           	SKIPA CHR,DPCDLC(PROG)	;Wants to delete some chars
  015           	MOVE CHR,DPCADC(PROG)	;Adding chars
  016           	TRNN AC2,777630		;Better not be any spurious bits on in the arg
  017           	SOSGE QDMCNT(TAC)
  018  009 029  	JRST DMXMT6		;Bad first arg, or missing second arg
  019           	ILDB AC1,QTAKR(TAC)	;Get second arg, which is offset from LE cursor
  020           	TRZE AC2,40		;Is offset bigger than fits in one byte?
  021           	IORI AC1,200		;Yes, turn on high-order bit in offset
  022  009 029  	JUMPE AC2,DMXMT6	;Zero correction count can't happen
  023           	PUSH P,AC2		;Save the number of chars to insert or delete
  024           	HLRZ AC2,AC3		;Get current X position
  025           	ADDI AC2,(AC1)		;Adjust it appropriately
  026           	CAMGE AC2,DPYWID(J)	;Did it go past end of screen?
  027           	JRST .+3		;No
  028           	SUB AC2,DPYWID(J)	;Yes, wrap around to next line
  029           	AOJA AC3,.-3
  030           	HRL AC3,AC2		;New X position back into position word for DMPREP
  031           	MOVEM AC3,QXY(TAC)	;Store it where DMXM5D will copy into DMXY
  032           	MOVEM DAT,DMLEFL(J)	;Store LE flags in case they have changed this xfer
  033  004 037  	TLZ DAT,DMATXY!DMXLE	;Don't let it store in DMLEXY, nor flags in DMLEFL
  034  004 061  	TLO DAT,IDON		;This xfer needs insert/delete mode
  035  018 133  	PUSHJ P,DMPREP		;Get us to proper position in proper mode
  036  004 061  	TLZ DAT,IDON		;Don't want I/D mode afterwards
  037           	MOVE AC2,CHR		;Sequence to output
  038           	POP P,CHR		;Get number of chars to insert or delete
  039  018 125  	PUSHJ P,DMOUT1		;Put the insertions or deletions in quicky buffer
  040           	SOJG CHR,.-1
  041  016 049  	JRST DMLED2		;Now go send all this stuff
                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 16␈↓'α
  001           ;DMLEDE DMPROT DMBLNK DMCANC DMID DMUP DMFOR3 DMEEOL DMLED1 DMLED2
  002           
  003           ;Routine for deleting chars from line editor.
  004  004 037  DMLEDE:	TLNN DAT,DMXLE		;Only valid for line editor xfer
  005  009 029  	JRST DMXMT6		;Not legal otherwise
  006  004 061  	TLO DAT,IDON		;This operation needs insert delete mode
  007  018 133  	PUSHJ P,DMPREP		;Make sure X-Y position and flags set up
  008  004 061  	TLZ DAT,IDON		;Now flush ID mode
  009           	SOSGE QDMCNT(TAC)
  010  007 039  	JRST DMXDEQ		;Oops, this ain't supposed to happen
  011           	ILDB AC1,QTAKR(TAC)	;Get count of chars to delete
  012           	SUBI AC1,1		;Sequence is output once normally
  013           	MOVNM AC1,RPTCNT(J)	;Number of times to restart this string
  014           	MOVEM DSER,RPTPTR(J)	;Byte pointer to beginning of string
  015           	MOVN AC3,DMQKCT(J)	;Figure size of repeat string by change in count
  016           	MOVE AC2,DPCDLC(PROG)	;Get delete-character output sequence
  017  018 125  	PUSHJ P,DMOUT1		;Output it to quicky buffer
  018           	ADD AC3,DMQKCT(J)	;-old+new = number of chars in repeat string
  019           	SUBI AC3,1		;When repeating, first char isn't counted down
  020           	MOVEM AC3,RPTSIZ(J)	;Store size for each repetition
  021           	MOVE AC3,PADCNT(J)	;Pick up padding count, if any
  022           	MOVEM AC3,RPTPAD(J)	;And remember for repeated copies
  023  016 049  	JRST DMLED2		;Uncount one output char, load last char, go.
  024           
  025  004 060  DMPROT:	TLOA DAT,PROTON		;Protected-field on mode
  026  004 059  DMBLNK:	TLO DAT,BLNKON		;Blink on mode
  027  009 029  	JRST DMXMT6
  028           
  029  004 059  DMCANC:	TLZ DAT,PROTON!BLNKON!IDON ;Clear all kinds of modes
  030  009 029  	JRST DMXMT6
  031           
  032  004 061  DMID:	TLO DAT,IDON		;Enter ID mode
  033  009 029  	JRST DMXMT6
  034           
  035           	DPCDLR(PROG)		;Ptr to output seq to delete row if in ID mode
  036           DMUP:	HRRZ AC1,AC3
  037  009 029  	SOJL AC1,DMXMT6		;Can't move up from top line, get next char
  038           	HLL AC1,AC3		;Maintain same X position
  039  004 034  	TLO DAT,CHASTE		;New virgin output line waiting
  040           	MOVEM AC1,QXY(TAC)	;Store new Y position
  041  004 036  DMFOR3:	TLNE DAT,DMATXY		;Is X-Y position stored somewhere special?
  042           	MOVEM AC1,@QXYLOC(TAC)	;Yes, store new Y position there
  043           	HLRM DAT,QFLAGS(TAC)	;Save transfer dependent flags
  044  009 029  	JRST DMXMT6		;Get next char from this xfer
  045           
  046  018 133  DMEEOL:	PUSHJ P,DMPREP		;Make sure cursor is at right place
  047           	MOVE AC2,DPCEOL(PROG)	;Get erase-to-end-of-line output sequence
  048  018 125  DMLED1:	PUSHJ P,DMOUT1		;And output it
  049           DMLED2:	SOS DMQKCT(J)		;As usual, don't count one quicky
  050           	LDB CHR,DSER		;Get back last character of quickies
  051  009 083  	JRST DMXM5D		;Now put out some quickies
                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 17␈↓'α
  001           ;DMCR3 DMLF2 DMLF3 DMCR4 DMCR DMLF DMLF1
  002           
  003           DMCR3:	HRRZS QXY(TAC)		;Back to column 0
  004           DMLF2:	HRRZ AC2,AC3		;Get screen line number
  005           	ADDI AC2,1
  006  004 033  	TLNE DAT,USERGO		;Can only wrap around to top in uninterruptible user prog
  007           	CAMGE AC2,DPYHGT(J)	;To bottom of screen?
  008  017 010  	JRST DMLF3		;No
  009           	MOVEI AC2,0		;Wrap around to top
  010           DMLF3:	HRRM AC2,QXY(TAC)	;Save new line number
  011  004 034  	TLO DAT,CHASTE		;Mark new line as untouched
  012           	POPJ P,
  013           
  014  018 133  DMCR4:	PUSHJ P,DMPREP		;Make sure cursor and modes are correct
  015  004 034  	TLNE DAT,CHASTE		;Need to erase this line we are leaving?
  016  004 031  	TLNE DAT,DMQUOT!NOEEOL!NOEEOB	;Here with CR ending blank line
  017           	POPJ P,			;No
  018           	MOVE AC2,DPCEOL(PROG)	;Yes, do it
  019  018 125  	JRST DMOUT1		;Output erase-to-end-of-line sequence
  020           
  021           DMCR:
  022           ;bugfix;HLL AC3,DMXY(J)		;We don't really care if X position is wrong
  023  017 014  	PUSHJ P,DMCR4		;Erase line we are leaving, if necessary
  024  009 076  	JRST DMCR2
  025           
  026           	DPCADR(PROG)		;Ptr to output seq to insert row if in ID mode
  027  004 037  DMLF:	TLNN DAT,DMXLE
  028  017 032  	JRST DMLF1
  029  004 030  	TLO DAT,NOEEOL		;Don't ever erase any lines now
  030  009 029  	JRST DMXMT6		;Ignore this bare LF from line editor
  031           
  032  017 014  DMLF1:	PUSHJ P,DMCR4		;Erase line we are leaving, if necessary
  033  017 004  	PUSHJ P,DMLF2		;Adjust Y position down a line
  034  009 081  	JRST DMLF4
                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 18/0␈↓'α
  001           ;DMCURS DMCUR2 DMXR2 DMOUT2 DMXL1 DMXR1 DMCUR4 DMYU2 DMYD1 DMYU1 DMCUR5 DPCBEG DM25CU HP26CU DPCEND TELE
                ;CU DMCUR3 DMOUT1 DMPREP DMPRE1 DMPR1A DMPRE2 DMPR2A DMPRE3 DMPRE4 DMPRE6 DMPR6A DMPRE7 DMPRE8
  002           
  003           DMCURS:	TLNE PROG,NOIDCU	;Skip is can't position while in ID mode
  004  004 061  	TRNN DAT,IDON		;Cannot position while in ID mode
  005  018 010  	JRST DMCUR2
  006  004 061  	TRZ DAT,BLNKON!PROTON!IDON
  007           	MOVEI AC1,CANCEL
  008           	IDPB AC1,DSER		;Turn 'em all off--it's the only way, sigh
  009           	AOS DMQKCT(J)		;Count a quicky
  010  018 124  DMCUR2:	JUMPE AC3,DMCUR3	;If positioning to upper left corner, use home char
  011           IFN 1,<
  012           	HRRZ AC1,DMXY(J)	;Old Y
  013           	HLRZ AC2,DMXY(J)	;Old X
  014           	CAIE AC1,(AC3)		;Right line?
  015  018 038  	JRST DMCUR4		;No
  016           	HLRZ AC1,AC3		;Yes, get new X
  017           	CAIN AC1,1(AC2)
  018  018 034  	JRST DMXR1		;Need to move right one
  019           	CAIN AC1,-1(AC2)
  020  018 033  	JRST DMXL1		;Need to move left one
  021           	CAIN AC1,2(AC2)
  022  018 026  	JRST DMXR2		;Need to move right two
  023           	CAIE AC1,-2(AC2)
  024  018 061  	JRST DMCUR5
  025           	SKIPA AC2,DPCLFT(PROG)	;Need to move left two
  026           DMXR2:	MOVE AC2,DPCRGT(PROG)	;Move right
  027  018 061  	JUMPE AC2,DMCUR5	;Jump if dump terminal can't move like that
  028           DMOUT2:	PUSH P,AC2
  029  018 125  	PUSHJ P,DMOUT1		;Output it once
  030           	POP P,AC2
  031  018 125  	JRST DMOUT1		;And output it again
  032           
  033           DMXL1:	SKIPA AC2,DPCLFT(PROG)	;Move left one
  034           DMXR1:	MOVE AC2,DPCRGT(PROG)	;Move right one
  035  018 125  	JUMPN AC2,DMOUT1
  036  018 061  	JRST DMCUR5		;Dumb terminal can't move cursor that way
  037           
  038           DMCUR4:	HLRZ AC1,AC3		;New X
  039           	CAIE AC1,(AC2)		;Right column?
  040  018 061  	JRST DMCUR5		;No, must use cursor positioning command
  041           	HRRZ AC1,DMXY(J)	;Old Y
  042           	CAML AC1,DPYHGT(J)	;Is it beyond bottom of screen?
  043  018 061  	JRST DMCUR5		;Yes, don't be fooled by having wrapped around
  044           	CAIN AC1,1(AC3)
  045  018 058  	JRST DMYU1		;Need to move up one
  046           	CAIN AC1,-1(AC3)
  047  018 057  	JRST DMYD1		;Need to move down one
  048           	CAIN AC1,2(AC3)
  049  018 053  	JRST DMYU2		;Need to move up two
  050           	CAIE AC1,-2(AC3)
  051  018 061  	JRST DMCUR5
  052           	SKIPA AC2,DPCDWN(PROG)	;Need to move down two
  053           DMYU2:	MOVE AC2,DPCUP(PROG)	;Move up two
  054  018 028  	JUMPN AC2,DMOUT2
  055  018 061  	JRST DMCUR5		;Dumb terminal can't move that way
  056           
  057           DMYD1:	SKIPA AC2,DPCDWN(PROG)	;Move down one
  058           DMYU1:	MOVEI AC2,DPCUP(PROG)	;Move up one
  059  018 125  	JUMPN AC2,DMOUT1
  060           >;1
  061           DMCUR5:	HRRZ AC2,DPCPOS(PROG)	;Address of routine to call to position cursor
  062  018 067  	CAIL AC2,DPCBEG		;Make sure it is valid address
  063  018 107  	CAILE AC2,DPCEND
  064           	JRST DMCERR		;Invalid cursor dispatch!!!!!
  065           	JRST (AC2)		;Use positioning routine for specific terminal
  066           
  067           DPCBEG::	;Beginning of cursor positioning routines for various terminals
  068           ;Cursor positioning routine for DM 2500.  Outputs FF X Y.
  069           DM25CU:	XOR AC3,[140,,140]	;Convert X-Y position to char format
  070           	HLRZ AC2,AC3
  071           	MOVEI AC1,14
  072           	IDPB AC1,DSER		;FF
  073           	IDPB AC2,DSER		;X-Pos
  074           	IDPB AC3,DSER		;Y-Pos
  075           	XOR AC3,[140,,140]	;Restore position word
  076           	MOVEI AC1,3
  077           	ADDM AC1,DMQKCT(J)	;Count three quickies to be output
  078           	POPJ P,
  079           
                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 18/0.1␈↓'α
  080           ;Cursor positioning routine for HP 2648A.  Outputs ESC & a 0 0 c 0 0 Y.
  081           HP26CU:	MOVEI AC1,33
  082           	IDPB AC1,DSER
  083           	MOVEI AC1,"&"
  084           	IDPB AC1,DSER
  085           	MOVEI AC1,"a"
  086           	IDPB AC1,DSER
  087           	HLRZ AC1,AC3		;desired X position
  088           	IDIVI AC1,=10
  089           	ADDI AC1,"0"
  090           	IDPB AC1,DSER
  091           	ADDI AC2,"0"
  092           	IDPB AC2,DSER
  093           	MOVEI AC1,"c"		;column select just ended
  094           	IDPB AC1,DSER
  095           	MOVEI AC1,(AC3)		;desired Y position
  096           	IDIVI AC1,=10
  097           	ADDI AC1,"0"
  098           	IDPB AC1,DSER
  099           	ADDI AC2,"0"
  100           	IDPB AC2,DSER
  101           	MOVEI AC1,"Y"		;row select just ended
  102           	IDPB AC2,DSER
  103           	MOVEI AC1,9
  104           	ADDM AC1,DMQKCT(J)	;number of quickies we just inserted
  105           	POPJ P,
  106           
  107           DPCEND::	;Last cursor positioning routine for specific terminal
  108           ;Cursor positioning routine for Teleray 1000 series.  Outputs ESC Y x y.
  109           TELECU:	MOVEI AC1,33
  110           	IDPB AC1,DSER
  111           	MOVEI AC1,"Y"
  112           	IDPB AC1,DSER
  113           	HLRZ AC1,AC3		;desired X position
  114           	ADDI AC1,40
  115           	IDPB AC1,DSER
  116           	MOVEI AC1,40(AC3)	;desired Y position, plus offset
  117           	IDPB AC1,DSER
  118           	MOVEI AC1,4	
  119           	ADDM AC1,DMQKCT(J)	;number of quickies we just inserted
  120           	POPJ P,
  121           ;Don't put arbitrary cursor positioning routines starting beyond DPCEND above.
  122           
  123           
  124           DMCUR3:	MOVE AC2,DPCHOM(PROG)	;Go to upper left corner
  125           DMOUT1:	TLZN AC2,400000
  126           	POPJ P,			;No char here, end of sequence
  127  006 106  	LSHC AC1,NBTSEQ		;Get next char in sequence into AC1
  128           	IDPB AC1,DSER		;Output one char of sequence
  129           	AOS DMQKCT(J)		;Count another quicky ready to go
  130  018 125  	JRST DMOUT1		;Continue through sequence
  131           
  132           
  133           DMPREP:	HRRZ AC2,AC3		;Get line number
  134           	CAML AC2,DPYHGT(J)	;Is it on screen?
  135  004 017  DMPRE1:	TROA DAT,BELOW		;No, set flag to suppress output of anything
  136  004 017  	TRZA DAT,BELOW
  137           	POPJ P,
  138  004 035  	TLNN DAT,PROTLE		;Want to avoid overwriting the line editor?
  139  018 162  	JRST DMPRE2		;No
  140           	SKIPGE LETAB(LINE)	;Is the line editor non-empty?
  141           	SKIPL AC2,LEPOS(J)	;Yes, Is the line editor positioned by LEYPOS
  142  018 162  	JRST DMPRE2		;No, go on
  143           	HRRZ AC1,LELINE(J)
  144           	SKIPN LECLK(J)		;Yes, is LELINE valid?
  145  018 155  	JRST DMPR1A		;Yes, use it
  146           REPEAT 0,<	;DON'T DELETE THIS CODE -- IT MAY COME BACK SOMEDAY SOON
  147           	LDB AC1,[POINT 11,AC2,21] ;Get user-specified position
  148           	TRNE AC1,1⊗=10		;Negative?
  149           	OR AC1,[-1⊗=10]		;Yes, extend sign
  150           >;REPEAT 0
  151           	HRRE AC1,LEYVAL(J)	;GET 18-BIT LINE EDITOR Y-POSITION FROM LEYPOS
  152           	EXCH AC1,AC3
  153           	PUSHJ P,POSLD2		;Convert to text line number
  154           	EXCH AC1,AC3		;User line in AC1, current position into AC3
  155           DMPR1A:	HRRZ AC2,NCRS(J)
  156           	ADD AC2,AC1		;Ending line of line editor
  157           	CAIG AC1,1(AC3)
  158           	CAIGE AC2,1(AC3)
  159  018 162  	JRST DMPRE2
                                                                          ␈↓&VDPSER.NEW[S,SYS] 09/05/79   Page 18/0.2␈↓'α
  160  018 135  	JRST DMPRE1		;Don't really do the output
  161           
  162           DMPRE2:	CAME AC3,DMXY(J)	;Are we at correct initial cursor position?
  163  018 003  	PUSHJ P,DMCURS		;No, position cursor
  164           	HLRZ AC1,DAT		;See if modes are all set correctly
  165  006 010  	TLNE PROG,NOBOLD
  166  018 169  	JRST DMPR2A		;Poor guy has inferior DM, don't hypnotize him
  167  004 037  	TLNE DAT,DMXLE		;Line editor transfer?
  168  004 059  	XORI AC1,BLNKON		;Yes, invert blinkingness (ie, intensity)
  169  004 067  DMPR2A:	TRNE CHR,CTRLCH		;Is this a non-displayable control character?
  170  004 059  	XORI AC1,BLNKON		;Yes, we want the other mode of blinkingness
  171           	XORI AC1,(DAT)
  172           	AND AC1,DPCMOD(PROG)	;Keep only the mode bits that exist
  173           	JUMPE AC1,CPOPJ		;Any modes in wrong sense?
  174           	TRNN AC1,(DAT)		;Yes, any on that should be off?
  175  018 179  	JRST DMPRE3		;No
  176           	TDZ DAT,DPCBCL(PROG)	;Yes, clear bits for modes this will clear
  177           	MOVE AC2,DPCMCL(PROG)	;Get output sequence to clear modes
  178  018 125  	PUSHJ P,DMOUT1		;Clear terminal modes
  179  004 060  DMPRE3:	TLNE DAT,PROTON		;Skip unless want blinking
  180           	SKIPN AC2,DPCBLI(PROG)	;Skip if this terminal has blinking
  181  018 184  	JRST DMPRE4
  182  004 060  	TRON DAT,PROTON		;Skip if blinking already on
  183  018 125  	PUSHJ P,DMOUT1		;Turn on blinking
  184  004 061  DMPRE4:	TLNE DAT,IDON		;Skip unless want ID mode
  185           	SKIPN AC2,DPCID(PROG)	;Skip if this terminal uses ID mode
  186  018 189  	JRST DMPRE6
  187  004 061  	TRON DAT,IDON		;Skip if ID mode already on
  188  018 125  	PUSHJ P,DMOUT1		;Turn on ID mode
  189  006 010  DMPRE6:	TLNE PROG,NOBOLD
  190  018 193  	JRST DMPR6A		;Poor guy has inferior DM, don't hypnotize him
  191  004 037  	TLNE DAT,DMXLE
  192  004 067  	TRC CHR,CTRLCH		;Invert emphasis of line editor
  193  004 067  DMPR6A:	TRZN CHR,CTRLCH		;Is this a non-displayable control char?
  194  018 199  	JRST DMPRE7
  195  004 059  	TLNE DAT,BLNKON		;Yes, emphasize only if not normally emphasized
  196           	POPJ P,			;Normally emphasized, but not this time
  197  018 200  	JRST DMPRE8
  198           
  199  004 059  DMPRE7:	TLNE DAT,BLNKON		;Is emphasis supposed to be on for this xfer?
  200           DMPRE8:	SKIPN AC2,DPCSEM(PROG)	;Skip if this terminal has emphasis
  201           	POPJ P,
  202  004 059  	TRON DAT,BLNKON		;Skip if emphasis already on
  203  018 125  	PUSHJ P,DMOUT1		;Turn on emphasis
  204            	POPJ P,
Symbol Table for:    VDPSER.NEW[S,SYS]                                       09/05/79   Page I
                     

BELOW  ← 004 017   DMCR3    017 003   DMPRE2   018 162   DMXMT0   007 012   NEC600   003 111   RAPPED ← 004 016 
BETWEE ← 004 032   DMCR4    017 014   DMPRE3   018 179   DMXMT1   007 048   NECCNV ← 003 382   RECDM    002*008 
BLNKON ← 004 059   DMCUR2   018 010   DMPRE4   018 184   DMXMT2   007 062   NECDSP ← 003 380   RECDM0   002 024 
C      M 005 022   DMCUR3   018 124   DMPRE6   018 189   DMXMT3   009*031   NECHAR   003 407   RECDM2   002 085 
CHASTE ← 004 034   DMCUR4   018 038   DMPRE7   018 199   DMXMT4   011 021   NECLR    003 092   RECDM3   002 057 
CHRMA0   003 240   DMCUR5   018 061   DMPRE8   018 200   DMXMT5   009 054   NECMOD ← 003*359   RECDM4   002 078 
CHRMA1   003 201   DMCURS   018 003   DMPREP   018 133   DMXMT6   009 029   NECNUM ← 003 376   RECDM5   002 052 
CHRMA2   003 208   DMEEOL   016 046   DMPROT   016 025   DMXMT7   011 004   NECQUO ← 003 378   RECDM6   002 082 
CHRMA3   003 214   DMERAS   010 036   DMQES2   003 346   DMXMT8   007 111   NECSUP ← 003 389   RECDM7   002 086 
CHRMA4   003 250   DMFOR2   010 052   DMQESC   003*339   DMXMT9   007*054   NECTRL ← 003 364   RECDM8   002 048 
CHRMA5   003 253   DMFOR3   016 041   DMQUOT ← 004 028   DMXMTL   009 003   NECVBP   003 459   RECDM9   002*074 
CHRMA6   003 218   DMFORW   010 066   DMSETQ   008 032   DMXMTM   009 024   NECVEC ← 003 391   RECNE2   003 062 
CHRMA7   003 237   DMHOME   010 044   DMSPA2   013 021   DMXMTO   009 023   NEFLSH   003 093   RECNEA   003 074 
CHRMA8   003 258   DMID     016 032   DMSPA3   013 026   DMXMTP   007 032   NEHOL1   003 105   RECNEC   003 052 
CHRMA9   003 261   DMLED1   016 048   DMSPA4   013 012   DMXMUS   009 008   NEHOLD   003 097   RECNED   003 005 
CHRMAC   003*181   DMLED2   016 049   DMSPA8   012 030   DMXR1    018 034   NEHTFL ← 003 354   RECNEE   003 086 
CHRMAC   003*463   DMLEDE   016 004   DMSPA9   012 017   DMXR2    018 026   NEMBPT   003 369   RECNEM   003 115 
CTRLCH ← 004 067   DMLEFX   015 008   DMSPAC   013 004   DMXRPT   007 023   NEMETA ← 003 363   RECNEN   003 081 
DM128  ← 006 008   DMLEM2   014 017   DMSTAY ← 004*022   DMYD1    018 057   NEMMOD ← 003*358   RECNEQ   003 065 
DM175    010 075   DMLEM3   014 021   DMTAB    012 015   DMYU1    018 058   NENUMB ← 003 361   RECNER   003 012 
DM177    011 008   DMLEM4   014 026   DMTAB3   009 057   DMYU2    018 053   NEQMOD ← 003 357   RECNES   003 089 
DM177B   010 078   DMLEM5   009 028   DMTABC   012*042   DPC    M 006 112   NEQUOT ← 003 362   RECNEZ   003 078 
DM2500   006 124   DMLEMV   014 004   DMTABL   005 024   DPCBEG   018 067   NESBPT   003 368   RECNM1   003 121 
DM25CU   018 069   DMLF     017 027   DMTAPE ← 004 068   DPCEND   018 107   NETBPT   003*366   RECNM2   003 134 
DM25PA   011 065   DMLF1    017 032   DMUMSK ← 004*064   GETMA1   003 287   NEUNH    003 106   RECNM3   003 138 
DM25PB   011 071   DMLF2    017 004   DMUP     016 036   GETMAC   003*274   NO177  ← 006 009   RECNNE   003 018 
DM30PA   011 055   DMLF3    017 010   DMUXFR ← 004 039   GETMAC   003*464   NOBOLD ← 006 010   RECNNQ   003 047 
DM30PB   011 059   DMLF4    009 081   DMXCAL ← 004 027   HP2648   006*151   NODICU ← 006*014   RECNSP   003 022 
DM30PD   011*049   DMMAST   010 034   DMXDEQ   007 039   HP26CU   018 081   NODPYH   007 119   RECQNC   003 028 
DMATXY ← 004 036   DMMOD0   003 322   DMXL1    018 033   IDON   ← 004 061   NODPYH   007 130   RECQSP   003 035 
DMBACK   010 050   DMMOD1   003 327   DMXLE  ← 004 037   IDSPCL ← 005 010   NOEDFL ← 003*353   RECQVC   003 041 
DMBELL   011 038   DMMODE   003*300   DMXM4A   011 020   IGNFF    010 028   NOEEOB ← 004 031   SKIPCR   009 097 
DMBET2   012 012   DMMODN   003 311   DMXM5A   009 066   IGNOR0   010 004   NOEEOL ← 004 030   TBSSET ← 004 015 
DMBETW   012 003   DMNOO2   009 061   DMXM5B   009 070   IGNOR2   010 026   NOINTR ← 004 018   TELECU   018 109 
DMBLNK   016 026   DMNOOP   009 060   DMXM5D   009 083   IGNOR3   010 005   PADID  ← 006 007   TELERA   006*178 
DMBPND ← 004*019   DMNOXY   007 104   DMXM5X   009 071   INQUOT ← 005 012   PDADDR ← 005 014   TRUNCA ← 004 029 
DMCALC   011 035   DMOUT1   018 125   DMXM8C   007 082   LEWAIT ← 004 020   PDDELR ← 005 015   USERGO ← 004 033 
DMCALX   011 078   DMOUT2   018 028   DMXM8L   007 075   MACMAX ← 003 179   PROTLE ← 004 035   VECTNM ← 003 405 
DMCANC   016 029   DMPADM   011 087   DMXM8U   007 091   NAM    ← 006 120   PROTON ← 004 060   XX     M 006 119 
DMCHPD   011 044   DMPR1A   018 155   DMXMG2   007 007   NBTSEQ ← 006 106   QUO177 ← 004 038   XYCHK    008 021 
DMCONV ← 005 013   DMPR2A   018 169   DMXMGO   007 009   NEALLQ ← 003 356   RANGE    009 108   XYGET    008 003 
DMCR     017 021   DMPR6A   018 193   DMXMT    007*003   NEBBPT   003 367   RANGE0   009*107   XYSPCL ← 005 011 
DMCR2    009 076   DMPRE1   018 135   
Cref of:    VDPSER.NEW[S,SYS]                                                               09/05/79   Page I
            

Key to types of symbol occurrences (Note references come last):

Dash - Reference.  : - Label.  ← - Assignment.
= - OPDEF or SYN.  + - Macro.  * - Block.  # - Variable.  ↑ - Global.


BELOW	 004←017 009-090 009-113 010-038 018-135 018-136
BETWEE	 004←032 004-064 012-015
BLNKON	 004←059 006-139 006-144 006-145 006-171 006-172 010-038 010-045 016-026 016-029 018-006 018-168 018-170 018-195
	 018-199 018-202
C	 005+022 005-025 005-026 005-028 005-029 005-030 005-032 005-034 005-038 005-039 005-040 005-047 005-048 005-050
	 005-052 005-054 005-055 005-059 006-113
CHASTE	 004←034 008-017 009-061 010-040 010-046 016-039 017-011 017-015
CHRMA0	 003:240 003-217
CHRMA1	 003:201 003-203
CHRMA2	 003:208 003-199 003-204
CHRMA3	 003:214 003-218
CHRMA4	 003:250 003-241 003-256
CHRMA5	 003:253 003-243
CHRMA6	 003:218 003-247 003-249 003-255
CHRMA7	 003:237 003-233
CHRMA8	 003:258 003-210
CHRMA9	 003:261 003-211
CHRMAC	 003:181 003:463
CTRLCH	 004←067 009-052 009-053 010-082 018-169 018-192 018-193
DM128	 006←008 009-048 010-078 010-080
DM175	 010:075 009-039
DM177	 011:008 009-035
DM177B	 010:078 011-009 011-014
DM2500	 006:124 006-120
DM25CU	 018:069 006-126
DM25PA	 011:065 011-032
DM25PB	 011:071 011-034
DM30PA	 011:055 011-049
DM30PB	 011:059 011-051
DM30PD	 011:049
DMATXY	 004←036 009-025 009-088 010-053 015-033 016-041
DMBACK	 010:050 005-032
DMBELL	 011:038 005-031
DMBET2	 012:012 012-004
DMBETW	 012:003 012-009 012-010 012-016
DMBLNK	 016:026 005-038
DMBPND	 004←019
DMCALC	 011:035 011-052
DMCALX	 011:078 011-045 011-046 011-067
DMCANC	 016:029 005-048
DMCHPD	 011:044 011-056 011-060
DMCONV	 005←013 002-062 005-027 005-050 005-051 005-054 005-055
DMCR	 017:021 005-037
DMCR2	 009:076 017-024
DMCR3	 017:003 009-080 010-070
DMCR4	 017:014 017-023 017-032
DMCUR2	 018:010 018-005
DMCUR3	 018:124 018-010
DMCUR4	 018:038 018-015
DMCUR5	 018:061 018-024 018-027 018-036 018-040 018-043 018-051 018-055
DMCURS	 018:003 007-085 018-163
DMEEOL	 016:046 005-047
DMERAS	 010:036 005-055
DMFOR2	 010:052 010-069
DMFOR3	 016:041 010-047 010-072
DMFORW	 010:066 005-052
DMHOME	 010:044 005-026
DMID	 016:032 005-040
DMLED1	 016:048 010-042
DMLED2	 016:049 015-041 016-023
DMLEDE	 016:004 005-029
DMLEFX	 015:008 005-030
DMLEM2	 014:017 014-019
DMLEM3	 014:021 014-017 014-024
DMLEM4	 014:026 014-022
DMLEM5	 009:028 014-028
DMLEMV	 014:004 005-028
DMLF	 017:027 005-034
DMLF1	 017:032 017-028
DMLF2	 017:004 017-033
DMLF3	 017:010 017-008
DMLF4	 009:081 017-034
Cref of:    VDPSER.NEW[S,SYS]                                                               09/05/79   Page II

DMMAST	 010:034 005-054
DMMOD0	 003:322 003-308 003-312
DMMOD1	 003:327 003-324
DMMODE	 003:300
DMMODN	 003:311 003-305
DMNOO2	 009:061 012-039
DMNOOP	 009:060 012-043
DMNOXY	 007:104 007-078 007-080 007-101
DMOUT1	 018:125 009-065 009-069 010-059 011-026 011-039 015-039 016-017 016-048 017-019 018-029 018-031 018-035 018-059
	 018-130 018-178 018-183 018-188 018-203
DMOUT2	 018:028 018-054
DMPADM	 011:087 011-080
DMPR1A	 018:155 018-145
DMPR2A	 018:169 018-166
DMPR6A	 018:193 018-190
DMPRE1	 018:135 018-160
DMPRE2	 018:162 018-139 018-142 018-159
DMPRE3	 018:179 018-175
DMPRE4	 018:184 018-181
DMPRE6	 018:189 018-186
DMPRE7	 018:199 018-194
DMPRE8	 018:200 018-197
DMPREP	 018:133 009-060 010-057 011-024 012-032 015-035 016-007 016-046 017-014
DMPROT	 016:025 005-039
DMQES2	 003:346 003-341
DMQESC	 003:339
DMQUOT	 004←028 004-064 009-011 009-036 009-062 010-012 012-026 017-016
DMSETQ	 008:032 007-084 009-024
DMSPA2	 013:021 013-013
DMSPA3	 013:026 013-018
DMSPA4	 013:012 013-028
DMSPA8	 012:030 013-024
DMSPA9	 012:017 013-030
DMSPAC	 013:004 005-056
DMSTAY	 004←022
DMTAB	 012:015 005-033 013-016
DMTAB3	 009:057 012-023 012-027 012-030
DMTABC	 012:042
DMTABL	 005:024 002-039 002-068 008-024 009-044 011-020 011-028
DMTAPE	 004←068 009-049 009-066 010-081
DMUMSK	 004←064
DMUP	 016:036 005-050
DMUXFR	 004←039 009-012 009-108
DMXCAL	 004←027 007-044
DMXDEQ	 007:039 008-004 008-010 009-005 009-030 011-011 014-007 014-010 015-011 016-010
DMXL1	 018:033 018-020
DMXLE	 004←037 007-039 008-016 009-085 014-004 015-008 015-033 016-004 017-027 018-167 018-191
DMXM4A	 011:020 011-006
DMXM5A	 009:066 009-063
DMXM5B	 009:070 009-067
DMXM5D	 009:083 009-072 010-062 011-031 011-078 011-085 011-089 016-051
DMXM5X	 009:071 009-115
DMXM8C	 007:082 007-102
DMXM8L	 007:075 007-096
DMXM8U	 007:091 007-074
DMXMG2	 007:007 007-088 009-021
DMXMGO	 007:009 007-030 009-095
DMXMT	 007:003
DMXMT0	 007:012 007-008
DMXMT1	 007:048 007-021 009-091
DMXMT2	 007:062 007-050 007-058
DMXMT3	 009:031
DMXMT4	 011:021 008-030 009-045
DMXMT5	 009:054 009-043 009-050 010-076 010-079 010-083 011-005 011-017 013-005 013-009
DMXMT6	 009:029 005-024 005-025 005-027 005-035 005-041 005-042 005-043 005-044 005-045 005-046 005-049 005-051 005-053
	 008-019 009-026 009-032 010-051 010-055 011-019 014-005 015-009 015-018 015-022 016-005 016-027 016-030 016-033
	 016-037 016-044 017-030
DMXMT7	 011:004 009-037
DMXMT8	 007:111 007-066 007-076 007-083 007-106
DMXMT9	 007:054
DMXMTL	 009:003 007-053
DMXMTM	 009:024 009-006 009-013
DMXMTO	 009:023 007-056 007-061 007-069 009-009
DMXMTP	 007:032 007-013
DMXMUS	 009:008 007-064
DMXR1	 018:034 018-018
DMXR2	 018:026 018-022
DMXRPT	 007:023 007-015
DMYD1	 018:057 018-047
Cref of:    VDPSER.NEW[S,SYS]                                                               09/05/79   Page III

DMYU1	 018:058 018-045
DMYU2	 018:053 018-049
DPC	 006+112 006-120 006-127 006-128 006-129 006-130 006-131 006-132 006-133 006-134 006-135 006-136 006-137 006-138
	 006-140 006-141 006-142 006-143 006-146 006-147 006-148 006-154 006-155 006-156 006-157 006-158 006-159 006-160
	 006-161 006-162 006-163 006-164 006-165 006-167 006-168 006-169 006-170 006-173 006-174 006-175 006-181 006-182
	 006-183 006-184 006-185 006-186 006-187 006-188 006-189 006-190 006-191 006-192 006-194 006-195
DPCBEG	 018:067 018-062
DPCEND	 018:107 018-063
GETMA1	 003:287 003-283
GETMAC	 003:274 003:464
HP2648	 006:151
HP26CU	 018:081 006-153
IDON	 004←061 006-171 009-109 010-038 010-045 011-022 015-034 015-036 016-006 016-008 016-032 018-004 018-006 018-184
	 018-187
IDSPCL	 005←010 005-032 005-034 005-050 005-052 011-021
IGNFF	 010:028 009-103 010-023 012-011 013-019
IGNOR0	 010:004 009-075
IGNOR2	 010:026 010-013
IGNOR3	 010:005 010-016 010-022 010-027
INQUOT	 005←012 002-044 002-050 002-055 005-027 005-054 005-055
LEWAIT	 004←020 007-049
MACMAX	 003←179 003-209
NAM	 006←120 006-125
NBTSEQ	 006←106 018-127
NEALLQ	 003←356 003-022 003-315
NEBBPT	 003:367 003-019 003-074
NEC600	 003:111 003-410
NECCNV	 003←382 003-059 003-072 003-435 003-455 003-456
NECDSP	 003←380 003-054 003-407 003-410 003-414 003-428 003-436 003-437 003-438 003-439
NECHAR	 003:407 003-007 003-441 003-447 003-450 003-453 003-459
NECLR	 003:092 003-428
NECMOD	 003←359
NECNUM	 003←376 003-081 003-443 003-445 003-450
NECQUO	 003←378 003-052 003-421 003-423 003-424 003-429 003-430
NECSUP	 003←389 003-023 003-024 003-410 003-414
NECTRL	 003←364 003-423 003-430
NECVBP	 003:459 003-041 003-047 003-193 003-282
NECVEC	 003←391 003-026
NEFLSH	 003:093 003-436
NEHOL1	 003:105 003-103
NEHOLD	 003:097 003-414
NEHTFL	 003←354 003-102
NEMBPT	 003:369 003-018 003-334
NEMETA	 003←363 003-429 003-430
NEMMOD	 003←358
NENUMB	 003←361 003-010 003-421
NEQMOD	 003←357 003-012
NEQUOT	 003←362 003-008 003-138 003-342 003-423 003-424 003-429 003-430
NESBPT	 003:368 003-075 003-078 003-086 003-089 003-139 003-343
NETBPT	 003:366
NEUNH	 003:106 003-100
NO177	 006←009 010-078
NOBOLD	 006←010 018-165 018-189
NODICU	 006←014
NODPYH	 007:119 007:130 007-005
NOEDFL	 003←353
NOEEOB	 004←031 004-064 017-016
NOEEOL	 004←030 004-064 009-062 013-004 017-016 017-029
NOINTR	 004←018 007-049 007-065 009-008
PADID	 006←007 011-030
PDADDR	 005←014 005-034 011-033 011-050
PDDELR	 005←015 005-050 011-050
PROTLE	 004←035 004-064 018-138
PROTON	 004←060 006-139 006-144 006-145 010-038 010-045 016-025 016-029 018-006 018-179 018-182
QUO177	 004←038 010-014 011-008
RANGE	 009:108 009-059 012-031
RANGE0	 009:107
RAPPED	 004←016 009-058 009-071
RECDM	 002:008
RECDM0	 002:024 002-017 002-021
RECDM2	 002:085 002-046 002-051 002-056 002-059 002-061 002-063 002-067 003-063
RECDM3	 002:057 002-054
RECDM4	 002:078 002-070
RECDM5	 002:052 002-041
RECDM6	 002:082 002-069 003-095
RECDM7	 002:086 002-066 002-076 003-109
RECDM8	 002:048 002-043
RECDM9	 002:074
RECNE2	 003:062 003-076 003-084
Cref of:    VDPSER.NEW[S,SYS]                                                               09/05/79   Page IV

RECNEA	 003:074 003-069 003-071
RECNEC	 003:052 003-036 003-048
RECNED	 003:005 002-029
RECNEE	 003:086 003-082
RECNEM	 003:115 003-051
RECNEN	 003:081 003-011
RECNEQ	 003:065 003-009 003-020
RECNER	 003:012 003-087
RECNES	 003:089 003-053
RECNEZ	 003:078 003-065
RECNM1	 003:121 003-135
RECNM2	 003:134 003-140
RECNM3	 003:138 003-123
RECNNE	 003:018 003-029 003-039
RECNNQ	 003:047 003-013 003-033
RECNSP	 003:022 003-015
RECQNC	 003:028 003-044
RECQSP	 003:035 003-025
RECQVC	 003:041 003-027
SKIPCR	 009:097 009-076 009-101
TBSSET	 004←015 010-034 012-026 012-042 013-008
TELECU	 018:109 006-180
TELERA	 006:178
TRUNCA	 004←029 004-064 009-074
USERGO	 004←033 004-064 007-041 007-049 017-006
VECTNM	 003←405 003-200
XX	 006+119 006-125 006-126 006-127 006-128 006-129 006-130 006-131 006-132 006-133 006-134 006-135 006-136 006-137
	 006-138 006-139 006-140 006-141 006-142 006-143 006-144 006-145 006-146 006-147 006-148
XYCHK	 008:021 008-005 008-011
XYGET	 008:003 005-036
XYSPCL	 005←011 005-026 005-036 005-041 005-042 005-048 005-054 005-055 008-027